作者:LeiLeiChen

https://llchen60.com/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

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

Reference

  1. https://www.baeldung.com/java-try-with-resources

  2. https://time.geekbang.org/column/article/220230

Redis、Kafka或RabbitMQ,哪个更和微服务更般配?
JDK 16 即将发布,看完这些新特性,我感觉已经学不动了..
Redis 分布式锁使用不当,超卖了100瓶飞天茅台!!!
SQL优化最干货总结(2021最新版)Redis 分布式锁使用不当,超卖了100瓶飞天茅台!!!为什么MySQL不推荐使用 UUID 或者雪花id作为主键?
今天,又被Java8的时间库恶心到了,有同感的举手...
Docker从入门到干活,看这一篇足矣点击阅读全文前往微服务电商教程

看看人家Java 集合处理/ 空值处理/ 异常处理多么优雅,一看就经验丰富!相关推荐

  1. java 不取空值_Java:如何更优雅的处理空值?

    在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼. 有时候,更可怕的是系统因为这些空值的情况, ...

  2. Java 集合经典面试题。少侠,我看你骨骼惊奇,是难得的代码奇才,来看了我的博客那岂不是如虎添翼?

    List 为什么 arraylist 不安全? 我们查看源码发现 arraylist 的 CRUD 操作,并没有涉及到锁之类的东西.底层是数组,初始大小为 10.插入时会判断数组容量是否足够,不够的话 ...

  3. 看看人家 SpringBoot 的全局异常处理多么优雅...

    1 SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求JDK:1.8SpringBoot:1.5.17.RELEASE 首先还是 ...

  4. Java高级-Lambda 表达式、异常处理、集合、泛型、List集合、Map集合、Collections类

    目录 Lambda 表达式 Java Lambda 表达式的优缺点 异常处理 Exception 处理及常见异常 try catch语句 try catch finally语句 throws 声明异常 ...

  5. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

  6. 【Java 集合】Java 集合主要脉络 ( Collection | Map | List | Set )

    文章目录 I 集合脉络 II List 接口简介 III Set 接口简介 IV Map 接口简介 V Collection 接口定义的方法 I 集合脉络 集合主要脉络 : Java 集合大的分类为两 ...

  7. java集合是wftc_Java集合

    一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...

  8. java 先进先出的map_「 深入浅出 」java集合Collection和Map

    本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...

  9. java char类型空值_展望Java的未来:空值类型

    java char类型空值 尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于 ...

最新文章

  1. Linux驱动框架之framebuffer驱动框架
  2. 实心和空心哪个抗弯能力强_空心砖4大优缺点一次看 便宜耐用营造大自然原始风...
  3. log4j的使用 与 父接口 slf4j 门面模式(外观模式)
  4. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
  5. 禅道启动mysql报错_测试工具之在Linux服务器上部署禅道Bug管理系统
  6. linux nvidia驱动安装rpm,Fedora 下安装NVIDIA显卡驱动
  7. 程序员面试宝典 笔记 第七章
  8. 有关Linux下的一些配置
  9. PHP动态网页设计:第2版pdf
  10. IDEA 社区版下载与安装
  11. 将assets文件转为byte[]
  12. labview压装设备最终代码,基于QMH框架和Machine框架有机结合
  13. Linux 权限管理深剖
  14. 声音采样率对声音事件分类的简单探究
  15. 又是一道题拉开差距!IOI落幕,中国队三金一银,美国华人选手再获冠军
  16. 大数据分析工程师面试集锦5--Spark面试指南
  17. Ten Rules of Good Studying
  18. 系统日志函数syslog和syslog配置
  19. ajax请求去获取base64_php如何获取ajax提交过来的经过base64处理后的图片
  20. MySQL 事务特性以及事务隔离级别

热门文章

  1. 二进制文件方式安装k8s 1.21
  2. 「数字化转型」数字化转型的12个步骤
  3. 来来来!java程序员个人优势
  4. 记录10--fedora 14下安装tftp软件
  5. 【MFC】数据库操作——ODBC(20)
  6. 一篇文章构建你的 NodeJS 知识体系
  7. 比“5G有多快”更重要的,是5G将带来哪些改变
  8. 三创赛历年优秀作品资料整理
  9. JDBC的全称是什么?
  10. MySQL学习分享之存储过程