Java try-with-resources

作者: 聪明的奇瑞 | 来源:发表于2018-02-01 16:51 被阅读95次
  • try-with-resources 是个语法糖,实际上就是自动调用资源的 close() 函数
try(RandomAccessFile randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt","rw")){
    randomAccessFile.write("abcd".getBytes());
} catch (Exception e) {
    e.printStackTrace();
}
  • try 语句多了个括号,这种在 try 后面加个括号,再初始化对象的语法就叫 try-with-resources,上面代码等同于
RandomAccessFile randomAccessFile = null;
try {
    randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt","rw");
    randomAccessFile.write("abcd".getBytes());
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (randomAccessFile != null) 
            randomAccessFile.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  • 编绎器自动在 try-with-resources 后面增加了判断对象是否为 null,不为 null 则调用 close() 函数

  • 只有实现了 java.lang.AutoCloseable 或 java.io.Closable 接口的对象才会自动调用 close() 函数

  • 上面代码编译器会为我们生成代码

try {
    RandomAccessFile randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt", "rw");
    Throwable var2 = null;

    try {
        randomAccessFile.write("abcd".getBytes());
    } catch (Throwable var12) {
        var2 = var12;
        throw var12;
    } finally {
        if (randomAccessFile != null) {
            if (var2 != null) {
                try {
                    randomAccessFile.close();
                } catch (Throwable var11) {
                    var2.addSuppressed(var11);
                }
            } else {
                randomAccessFile.close();
            }
        }
    }
    } catch (Exception var14) {
        var14.printStackTrace();
    }
  • 可以发现还有一个 Throwable.addSuppressed 的调用,当使用 try-with-resources 语句之后,有可能会出现两个异常:
    • 一个是 try 块里的异常
    • 一个是调用 close 函数里抛出的异常
  • 如果 close 函数时出现异常,那么前面的异常就被成为 Suppressed Exceptions,因此 Throwable 有个 addSuppressed 方法可以将它们保存起来,当用户捕捉到 close() 异常时,就可以调用 Throwable.getSuppressed 方法取出之前的异常了

相关文章

网友评论

    本文标题:Java try-with-resources

    本文链接:https://www.haomeiwen.com/subject/sxadzxtx.html