【补充知识】try...catch语句的新特性

感谢 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——

找遍全网只有两个特性啊。。。(失望脸)

java
166 views
Comments
登录后评论
Sign In
·

jdk7 没记错的话已经是十年前发布的了 joy

·

hackertalk 后端是 jdk17