考虑以下try-with-resources块:
try (Foo foo = getAFoo()) {
}
对于某些班级 Foo 实现 java.lang.AutoCloseable。
如果 getAFoo() 回来了 null,然后在结束括号上抛出空指针异常(由于运行时试图调用 close)?
考虑以下try-with-resources块:
try (Foo foo = getAFoo()) {
}
对于某些班级 Foo 实现 java.lang.AutoCloseable。
如果 getAFoo() 回来了 null,然后在结束括号上抛出空指针异常(由于运行时试图调用 close)?
根据 这个Oracle博客:
经过充分考虑后,JSR 334专家组已决定对null资源上的try-with-resources语句的语义应更改如下:编译器生成的关闭资源的调用仅在资源为非null时才会发生。
这意味着你可以关闭任何 null 资源 try (使用资源)阻止而不抛出错误(当程序自动尝试关闭资源时也是如此) try 结束)。
你实施 java.lang.AutoCloseable因此编译器会在完成时尝试关闭资源,但只有在资源处理时才会发生关闭资源的进程 non-null。所以在这种情况下,我认为不会抛出异常。