看看人家Java 集合处理/ 空值处理/ 异常处理多么优雅,一看就经验丰富!
作者: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
https://www.baeldung.com/java-try-with-resources
https://time.geekbang.org/column/article/220230
Redis、Kafka或RabbitMQ,哪个更和微服务更般配?
JDK 16 即将发布,看完这些新特性,我感觉已经学不动了..
Redis 分布式锁使用不当,超卖了100瓶飞天茅台!!!
SQL优化最干货总结(2021最新版)Redis 分布式锁使用不当,超卖了100瓶飞天茅台!!!为什么MySQL不推荐使用 UUID 或者雪花id作为主键?
今天,又被Java8的时间库恶心到了,有同感的举手...
Docker从入门到干活,看这一篇足矣点击阅读全文前往微服务电商教程
看看人家Java 集合处理/ 空值处理/ 异常处理多么优雅,一看就经验丰富!相关推荐
- java 不取空值_Java:如何更优雅的处理空值?
在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼. 有时候,更可怕的是系统因为这些空值的情况, ...
- Java 集合经典面试题。少侠,我看你骨骼惊奇,是难得的代码奇才,来看了我的博客那岂不是如虎添翼?
List 为什么 arraylist 不安全? 我们查看源码发现 arraylist 的 CRUD 操作,并没有涉及到锁之类的东西.底层是数组,初始大小为 10.插入时会判断数组容量是否足够,不够的话 ...
- 看看人家 SpringBoot 的全局异常处理多么优雅...
1 SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求JDK:1.8SpringBoot:1.5.17.RELEASE 首先还是 ...
- Java高级-Lambda 表达式、异常处理、集合、泛型、List集合、Map集合、Collections类
目录 Lambda 表达式 Java Lambda 表达式的优缺点 异常处理 Exception 处理及常见异常 try catch语句 try catch finally语句 throws 声明异常 ...
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
本文关键词: java集合框架 框架设计理念 容器 继承层级结构 继承图 集合框架中的抽象类 主要的实现类 实现类特性 集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...
- 【Java 集合】Java 集合主要脉络 ( Collection | Map | List | Set )
文章目录 I 集合脉络 II List 接口简介 III Set 接口简介 IV Map 接口简介 V Collection 接口定义的方法 I 集合脉络 集合主要脉络 : Java 集合大的分类为两 ...
- java集合是wftc_Java集合
一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...
- java 先进先出的map_「 深入浅出 」java集合Collection和Map
本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...
- java char类型空值_展望Java的未来:空值类型
java char类型空值 尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于 ...
最新文章
- Linux驱动框架之framebuffer驱动框架
- 实心和空心哪个抗弯能力强_空心砖4大优缺点一次看 便宜耐用营造大自然原始风...
- log4j的使用 与 父接口 slf4j 门面模式(外观模式)
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
- 禅道启动mysql报错_测试工具之在Linux服务器上部署禅道Bug管理系统
- linux nvidia驱动安装rpm,Fedora 下安装NVIDIA显卡驱动
- 程序员面试宝典 笔记 第七章
- 有关Linux下的一些配置
- PHP动态网页设计:第2版pdf
- IDEA 社区版下载与安装
- 将assets文件转为byte[]
- labview压装设备最终代码,基于QMH框架和Machine框架有机结合
- Linux 权限管理深剖
- 声音采样率对声音事件分类的简单探究
- 又是一道题拉开差距!IOI落幕,中国队三金一银,美国华人选手再获冠军
- 大数据分析工程师面试集锦5--Spark面试指南
- Ten Rules of Good Studying
- 系统日志函数syslog和syslog配置
- ajax请求去获取base64_php如何获取ajax提交过来的经过base64处理后的图片
- MySQL 事务特性以及事务隔离级别