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开发手册(嵩山版)》最新公布,速速下载!

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