Java 异常编写小技巧

互联网全栈架构

共 2219字,需浏览 5分钟

 ·

2021-11-15 13:42

点击上方“猿芯”,选择“设为星标

后台回复"1024",有份惊喜送给面试的你

1 多个异常块 catch 写法

参考 Nacosnacos-config 子项的 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;
}

当我们有多个异常需要相同异常处理时,可以采用 catch(XxxException | XxxExcetion) 方式处理,代码看起来也非常简洁和优雅。

2 资源关闭 try-with-resource

Jdk 1.7之后有了 try-with-resource 处理机制。

本地代码参考 Nacos 批量上传配置文件接口,关闭资源写法

  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,不需要开发者手动关闭文件流资源。


推荐阅读:

Redis为什么变慢,一文讲透如何排查Redis性能问题

7张图揭晓RocketMQ存储设计的精髓

腾讯二面:Redis 事务支持 ACID 么?

聊聊分布式锁——Redis和Redisson的方式

互联网全栈架构

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报