乐趣区

关于java:Java-集合处理-空值处理-异常处理使用心得分享

1. Arrays.asList

业务开发当中,咱们经常会将原始的数组转换为 List 类数据结构,来持续开展各种 Stream 操作

  • Arrays.asList 无奈转换根本类型的数组,能够应用 Arrays.stream 来进行转换
  • Arrays.asList 返回的 list 是不反对增删操作的,其返回的 List 是 Arrays 的外部类 ArrayList。外部继承自 AbstractList,没有覆写父类的 add 办法
  • 对原始数组的批改会影响到咱们取得的那个 List

    • ArrayList 实际上是应用了原始的数组,因而在应用的时候,最好再应用 New ArrayList 来实现解耦

2. 空值解决

2.1 NullPointerException

  • 可能呈现的场景

    • 参数值是 Integer 等包装类型,应用时因为主动拆箱呈现了空指针异样
    • 字符串比拟
    • ConcurrentHashMap 这种容器不反对 Key 和 Value 为 null,强行 put null 的 key 或 Value 会呈现空指针异样
    • 办法或近程服务返回的 list 是 null,没做判空就间接调用,呈现空指针异样
    • 联级调用的 null check
  • best practice

    • string.equalsTo(variableName)
    • Optional.ofNullable()
    • orElse()

3. 异样解决

3.1 在业务代码层面思考异样解决

  • 大多数业务利用都采纳三层架构

    • Controller 层

      • 负责信息收集,参数校验,转换服务层解决的数据适配前端,轻业务逻辑
      • Controller 捕捉异样,而后须要给用户友好用户的提醒
    • Service 层

      • 负责外围业务逻辑,包含内部服务调用,拜访数据库,缓存解决,音讯解决等
      • 个别会波及到数据库事务,出现异常不适宜捕捉,否则事务无奈主动回滚
    • Repository 层

      • 负责数据拜访实现,个别没有业务逻辑
      • 依据状况来做疏忽,降级,或者转化为一个敌对的异样
  • 框架层面的异样解决

    • 尽量不要在框架层面做异样的主动,对立的解决
    • 框架该当来做兜底工作,如果异样回升到最上层逻辑还是无奈解决的话,能够用对立的形式进行异样转换

      • @RestControllerAdvice
      • @ExceptionHandler

3.2 不要间接生吞异样

捕捉了异样当前不应该生吞,因为吞掉的异样如果没有失常解决的话,呈现 Bug 会很难发现。

须要有适合的转化成用户敌对的异样,或者至多在 warn,error 级别来做 log

3.3 保留原始的信息

在捕获了异样之后,肯定要记得在 log 或者在向外扔出的异样之中记录原始异样信息

catch (IOException e) {
    // 只保留了异样音讯,栈没有记录
    log.error("文件读取谬误, {}", e.getMessage());
    throw new RuntimeException("零碎忙请稍后再试");
}


catch (IOException e) {throw new RuntimeException("零碎忙请稍后再试", e);
}123456789

另外,关注公众号 Java 技术栈,在后盾回复:面试,能够获取我整顿的 Java 系列面试题和答案,十分齐全。

3.4 小心 finally 中的异样 + try with resources

留神在资源开释解决等收尾操作的时候也可能会出现异常,这种时候,如果 try block 逻辑和 finnally 逻辑都有异样抛出的话,try 当中的异样会被 finnally 中的异样笼罩掉,这会让问题变得十分不显著。

@GetMapping("wrong")
public void wrong() {
    try {log.info("try");
        // 异样失落
        throw new RuntimeException("try");
    } finally {log.info("finally");
        throw new RuntimeException("finally");
    }
}12345678910

对于实现了 AutoCloseable 接口的资源,能够应用 try-with-resources 来开释资源,就是在 try 中带资源的申明

try catch finally vs try with resources

Scanner scanner = null;
try {scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {e.printStackTrace();
} finally {if (scanner != null) {scanner.close();
    }
}

try (Scanner scanner = new Scanner(new File("test.txt"))) {while (scanner.hasNext()) {System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {fnfe.printStackTrace();
}
123456789101112131415161718192021

3.5 线程池工作的异样解决

设置自定义的异样处理程序作为保底,比方在申明线程池时自定义线程池的未捕捉异样处理程序:

new ThreadFactoryBuilder()
  .setNameFormat(prefix+"%d")
  .setUncaughtExceptionHandler((thread, throwable)-> log.error("ThreadPool {} got exception", thread, throwable))
  .get()1234

最初,关注公众号 Java 技术栈,在后盾回复:面试,能够获取我整顿的 Java 系列面试题和答案,十分齐全。

Reference

  1. https://www.baeldung.com/java…
  2. https://time.geekbang.org/col…

近期热文举荐:

1.600+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版