“自动关闭”为空时的“试用资源”

2022-08-31 13:12:53

try-with 功能如何为已声明的变量工作?AutoCloseablenull

我以为当它尝试在变量上调用时,这会导致空指针异常,但它没有问题:close

try (BufferedReader br = null){
    System.out.println("Test");
}
catch (IOException e){
    e.printStackTrace();
}

答案 1

Java 语言规范指定仅当非空时才关闭它,在 14.20.3 节中。

仅当资源初始化为非空值时,才会关闭资源。

这实际上很有用,因为有时资源可能存在,而其他资源则不存在。

例如,假设您可能有也可能没有指向某些远程日志记录系统的可关闭代理。

try ( IRemoteLogger remoteLogger = getRemoteLoggerMaybe() ) {
    if ( null != remoteLogger ) {
       ...
    }
}

如果引用不为 null,则远程记录器代理将关闭,正如我们预期的那样。但是,如果引用为 null,则不会尝试在其上调用 close(),也不会引发 NullPointerException,并且代码仍然有效。


答案 2

推荐