不可变集合
什么是不可变集合
数据在创建时加入,在集合的整个生命周期中,元素都不会被修改。
最佳实践:如何创建不可变集合
Lists.of()
Sets.of()
Maps.of()
Stream
Stream流是什么
相当于一条传送带,将数据放到传送带上,进行处理
Stream 流的方法有哪几种
- 获取Stream 流:创建流水线,把元素放到流水线上
- 中间操作:流水线上的操作
- 终结方法:收集元素
集合如何获取 Stream 流
集合.stream() 方法
数组如何获取 Stream 流
Stream.stream(数组)
Stream.of(数组/可变数据)
有哪些中间操作的方法,特点是什么
在Stream流中无法直接修改集合、数组中的数据
有哪些终结操作的方法,特点是什么
终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了
有哪些收集操作的方法,特点是什么
将操作的数据结果恢复到集合或者数组中去
异常体系
什么是异常,语法错误算是异常吗,编译出现的问题算是异常吗,运行时出现的问题算是异常吗
不算,算,算
为什么需要处理异常
异常会导致程序退出JVM虚拟机而终止。
处理异常:1.避免异常出现 2.提前处理可能会出现的异常
异常体系
Error:系统级别的、JVM退出等使程序无法继续运行的错误,代码无法控制
Exception:系统中的,代码可以处理的问题
RuntimeException及其子类:运行时异常,编译阶段不会报错。 (空指针异常,数组索引越界异常)
除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。 (日期格式化异常)。
运行时异常的默认处理流程
- 默认会在出现异常的代码那里自动的创建一个异常对象,如:ArithmeticException。
- 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
- 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
- 直接从当前执行的异常点干掉当前程序。
- 后续代码没有机会执行了,因为程序已经死亡
默认的异常处理机制并不好,一旦真的出现异常,程序立即死亡。
最佳实践:编译时异常处理
-
出现异常直接抛出去给调用者,调用者也继续抛出去。
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
-
出现异常自己捕获处理,不麻烦别人。
这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行
-
前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理
实际应用中,只要代码能够编译通过,并且功能能完成,那么每一种异常处理方式似乎也都是可以的。
最佳实践:运行时异常的处理
运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
按照规范建议还是处理:建议在最外层调用处集中捕获处理即可。
如何自定义编译时异常
- 定义一个异常类继承Exception.
- 重写构造器。
- 在出现异常的地方用throw new 自定义对象抛出
作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!
如何自定义运行时异常
- 定义一个异常类继承RuntimeException.
- 重写构造器。
- 在出现异常的地方用throw new 自定义对象抛出!
作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!