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开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!