感谢 j2go 大佬的指点,我爱内卷 去网上全面查找了,找到这么几个新特性
多异常捕获机制
此处的多异常捕获,并不是只多个catch子句。当你发现几个异常被捕捉后的处理方式完全相同时,可以用这个机制来简化代码。
传统的catch子句中可以指定一个异常对象,常见的写法为这样:
try {
} catch (NullPointerException e) {
e.printStackTrace();
}
现在发现一个需要处理的数组下标越界异常,处理方式也是输出堆栈信息,在JDK8以后我们不需要重新写一个catch,可以这样处理:
try {
} catch (NullPointerException | IndexOutOfBoundsException e) {
e.printStackTrace();
}
语法是用或运算符(不是短路或)分隔两个类
这样可以理解为,catch子句指定了异常E1 | E2 e
,当我们捕捉到E1的时候,这个catch子句中出现的异常对象就是E1 e
,该子句中的e对象的类型全部是E1,E2同理
我们做到了用一个catch子句同时捕捉两个异常,且用相同的方式处理它们。这样可以节省代码行数并提升可读性,避免了冗余
try-with-resources写法
这是一种专门针对IO流的写法,JDK7以后,这种写法给流的操作带来了很多便利
我们知道IO流的几个特殊写法:
- 需要关流
- 变量声明和赋值操作分离
昨天学完的同学,相信都学得烦死了,想把JDK里的流都删掉对不对,那么j2go大佬提供了一种新写法。昨天的最终成果可以改写为:
try (FileInputStream fis = new FileInputStream(path)) {
} catch (IOException e) {
e.printStackTrace();
}
注意看,try后面有一个括号,括号里面是流对象的声明和赋值,整个过程属于try语句但不属于try子句的作用域,解决了声明和赋值分离的问题;而且我没有写finally语句,因为这种写法专门针对流的使用,它会自动把流关掉。
而且这种写法可以支持多个流的同时定义,比如这样的写法也是不报错且按预期运行的:
try (FileInputStream fis = new FileInputStream(path);
FileOutputStream fos = new FileOutputStream(path);
FileReader fr = new FileReader(path);
FileWriter fw = new FileWriter(path)) {
} catch (IOException e) {
e.printStackTrace();
}
在这个语句中,我们定义了四个流对象,并使用分号分隔。这样的写法,四个流对象都是可以正常运行,并且最后会被关掉
finally——
找遍全网只有两个特性啊。。。(失望脸)