我的代码如下所示:
try {
FileInputStream is = new FileInputStream("blah.properties");
properties.load(is);
}catch(...){ }
finally { }
最后不会关闭InputStream
。我听说过不同的关于Java 1.6的论点,不需要关闭这个InputStream
等资源,Garbage收集器应该能够处理它,还有其他人仍然会通过关闭资源来发誓。
a)上述理论的任何确凿证据?
b)为什么FindBugs没有检测到这一点,即使在项目设置中打开“低可信度”模式也是如此。
答案 0 :(得分:1)
我听说过关于Java 1.6的各种争论都没有要求 要关闭此InputStream的资源,垃圾收集器 应该能够照顾它
垃圾收集将关闭已经打开的资源,但为什么这样做呢?根据有效Java第3版 Joshua Bloch :
关闭资源经常被客户忽视,可预见的可怕性能后果 ...在使用必须关闭的资源时,始终优先使用try-with-resources进行try-finally 的
为什么FindBugs没有检测到这一点,即使在"低信心"模式正在 在项目设置中打开。
我使用你的代码在Eclipse中运行Findbugs。它对我来说也不起作用,但FindBugs异常出现在Eclipse的错误日志中:
!ENTRY edu.umd.cs.findbugs.plugin.eclipse 4 4 2018-01-21 01:17:25.303
!MESSAGE The following errors occurred during FindBugs analysis:
!SUBENTRY 1 edu.umd.cs.findbugs.plugin.eclipse 4 0 2018-01-21 01:17:25.303
!MESSAGE Error scanning com/HelloWorld9 for referenced classes
!STACK 0
java.lang.IllegalArgumentException at org.objectweb.asm.ClassReader.<init>(ClassReader.java:170)
你看到同样的事吗?另外,note this:
......看起来FindBugs永远不会支持Java 9. SpotBugs就是 更换。
所以我用SpotBugs插件替换了FindBugs插件,并正确报告了Method may fail to close stream:
如果您只是将SpotBugs替换为SpotBugs,一切都应该没问题。