当AutoCloseable为null时,尝试使用资源

fla*_*kes 41 java try-catch autocloseable

try-with功能如何适用于AutoCloseable已声明的变量null

我假设这会在尝试调用close变量时导致空指针异常,但它运行没有问题:

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

And*_*mas 57

Java语言规范指定仅在非空时关闭它,在14.20.3节中.尝试资源:

仅当资源初始化为非空值时才关闭资源.

当资源有时可能存在并且缺少其他资源时,这实际上可能是有用的.

例如,假设您可能或可能没有某个远程日志记录系统的可关闭代理.

try ( IRemoteLogger remoteLogger = getRemoteLoggerMaybe() ) {
    if ( null != remoteLogger ) {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果引用为非null,则远程记录器代理将关闭,正如我们所期望的那样.但是如果引用为null,则不会尝试对其调用close(),不会抛出NullPointerException,代码仍然有效.

  • 哈哈,你刚刚添加的用例是我首先提出问题的原因!谢谢! (2认同)
  • 还是很酷!很高兴看到语言设计者想到了这个案例。 (2认同)