Java 異常編寫小技巧
后臺(tái)回復(fù)"1024",有份驚喜送給面試的你
1 多個(gè)異常塊 catch 寫法
參考 Nacos 的 nacos-config 子項(xiàng)的 BaseDatabaseOperate 類。
default?Boolean?update(TransactionTemplate?transactionTemplate,?JdbcTemplate?jdbcTemplate,List?contexts,?BiConsumer?consumer)
try?{???
????return?Boolean.TRUE;
}?catch?(BadSqlGrammarException?|?DataIntegrityViolationException?e)?{
????FATAL_LOG.error("[db-error]?sql?:?{},?args?:?{},?error?:?{}",?errSql[0],?args[0],?e.toString());
????return?Boolean.FALSE;
}
當(dāng)我們有多個(gè)異常需要相同異常處理時(shí),可以采用 catch(XxxException | XxxExcetion) 方式處理,代碼看起來也非常簡(jiǎn)潔和優(yōu)雅。
2 資源關(guān)閉 try-with-resource
在 Jdk 1.7之后有了 try-with-resource 處理機(jī)制。
本地代碼參考 Nacos 批量上傳配置文件接口,關(guān)閉資源寫法
??try?(DiskUtils.LineIterator?iterator?=?DiskUtils.lineIterator(file))?{
????int?batchSize?=?1000;
????List?batchUpdate?=?new?ArrayList<>(batchSize);
????List>?futures?=?new?ArrayList<>();
????List?results?=?new?CopyOnWriteArrayList<>();
????while?(iterator.hasNext())?{
????????String?sql?=?iterator.next();
????????if?(StringUtils.isNotBlank(sql))?{
????????????batchUpdate.add(sql);
????????}
????????if?(batchUpdate.size()?==?batchSize?||?!iterator.hasNext())?{
????????????List?sqls?=?batchUpdate.stream().map(s?->?{
????????????????ModifyRequest?request?=?new?ModifyRequest();
????????????????request.setSql(s);
????????????????return?request;
????????????}).collect(Collectors.toList());
????????????futures.add(CompletableFuture.runAsync(()?->?results.add(doDataImport(jdbcTemplate,?sqls))));
????????????batchUpdate.clear();
????????}
????}
????CompletableFuture.allOf(futures.toArray(new?CompletableFuture[0])).join();
????return?RestResult.builder()
????????????.withCode(BooleanUtils.and(results.toArray(new?Boolean[0]))???200?:?500).withData("").build();
}?catch?(Throwable?ex)?{
????LogUtil.DEFAULT_LOG.error("An?exception?occurred?when?external?data?was?imported?into?Derby?:?{}",?ex);
????return?RestResultUtils.failed(ex.getMessage());
}
示例代碼 try (DiskUtils.LineIterator iterator = DiskUtils.lineIterator(file)) 包含文件流讀取,所以符合 try-with-resource,不需要開發(fā)者手動(dòng)關(guān)閉文件流資源。
推薦閱讀:
7張圖揭曉RocketMQ存儲(chǔ)設(shè)計(jì)的精髓
歡迎關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)全棧架構(gòu),收取更多有價(jià)值的信息。
評(píng)論
圖片
表情
