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
- https://www.baeldung.com/java…
- https://time.geekbang.org/col…
近期热文举荐:
1.600+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!