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);
}
另外,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 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");}
}
对于实现了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();
}
3.5 线程池任务的异常处理
设置自定义的异常处理程序作为保底,比如在声明线程池时自定义线程池的未捕获异常处理程序:
new ThreadFactoryBuilder().setNameFormat(prefix+"%d").setUncaughtExceptionHandler((thread, throwable)-> log.error("ThreadPool {} got exception", thread, throwable)).get()
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
Reference
https://www.baeldung.com/java-try-with-resources
https://time.geekbang.org/column/article/220230
Java 集合处理/ 空值处理/ 异常处理,使用心得分享!相关推荐
- 看看人家Java 集合处理/ 空值处理/ 异常处理多么优雅,一看就经验丰富!
作者:LeiLeiChen https://llchen60.com/Java-集合处理-和-空值处理/ 1. Arrays.asList 业务开发当中,我们常常会将原始的数组转换为List类数据结构 ...
- Java高级-Lambda 表达式、异常处理、集合、泛型、List集合、Map集合、Collections类
目录 Lambda 表达式 Java Lambda 表达式的优缺点 异常处理 Exception 处理及常见异常 try catch语句 try catch finally语句 throws 声明异常 ...
- Java集合框架笔记记录 --- 原创@余胜军 但有个人心得
Java集合框架课程安排 1.集合框架API知识 List/Set/Map集合 2.常见数据结构 数组/链表/队列/树 3.集合源码解读 List/Set/Map1.为什么需要学习Java中集合框架呢 ...
- 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邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于 ...
- Java集合系列之四大常用集合(ArrayList、LinkedList、HashSet、HashMap)的用法
Java集合系列之四大常用集合(ArrayList.LinkedList.HashSet.HashMap)的用法 ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是A ...
- java集合,Collection,list,set,map汇总
1 Java集合简介 Java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器(集合)来装载 简单来说集 ...
最新文章
- linux useradd
- visual code 在标签页打开_VSCode 不在新标签页打开文件如何解决?
- 非常震撼!微软 Win 10X 系统的深度体验
- php关于路由,PHP URL路由类实例
- 零基础学python全彩版pdf-(特价书)零基础轻松学Python:青少年趣味编程(全彩版)...
- 局部图像描述子——Harris角点检测器
- C#图像处理基础概念知识
- 【转】浅析Java中的final关键字
- mysql数据库第五章_第五章 数据库的查询
- ae导出gif插件_AE小白必看教程,围观AE老司机如何使用AE导出gif图片
- jdbcdbcpc3p0
- Python小白的数学建模课-21.关键路径法
- [Windows系统]visio安装时提示和即点即用版本不能并行怎么办
- 认识计算机的桌面,电脑桌面的基础知识教程,教你认识电脑桌面
- POI 复制 word 表中的行操作 以及样式
- 阿里巴巴国际站运营排名规则 外贸b2b平台阿里巴巴国际站优化技巧方法
- 【LOJ573】「LibreOJ NOI Round #2」单枪匹马(矩阵乘法)
- 关于线的做法T568A与T568B网络故障
- 【系统分析师之路】第十七章 多媒体基础章节习题集
- js 模拟短信发送 JavaScript
热门文章
- 高效管理CrossOver容器里的程序
- Tiny-Spring源码阅读(一)IOC的理解
- Centos6.7 64位安装配置kvm虚拟化
- “勒索文件”或可部分恢复
- 如何解决Configuration system failed to initialize
- 文件服务器自动化管理
- poj 2182 Lost Cows 线段树!!!!
- API文档和代码片段管理器:​​​​Dash
- 苹果Mac数据恢复工具:​​​​​​​​Disk Drill Enterprise
- SoundSource 5 for Mac(音频控制工具)