FindBugs并不关心InputStreams

时间:2018-01-12 00:21:36

标签: java resources inputstream findbugs

我的代码如下所示:

try {

    FileInputStream is = new FileInputStream("blah.properties");
    properties.load(is);

}catch(...){ }
finally { }

最后不会关闭InputStream。我听说过不同的关于Java 1.6的论点,不需要关闭这个InputStream等资源,Garbage收集器应该能够处理它,还有其他人仍然会通过关闭资源来发誓。

a)上述理论的任何确凿证据?

b)为什么FindBugs没有检测到这一点,即使在项目设置中打开“低可信度”模式也是如此。

1 个答案:

答案 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

spotBugsWorks

如果您只是将SpotBugs替换为SpotBugs,一切都应该没问题。