java – IntStream何时实际关闭? SonarQube S2095对IntStream是误报吗?

我使用Java 8流代替许多旧样式for循环来迭代一堆结果并生成摘要统计信息.例如:

int messages = IntStream.rangeClosed(0, 7).map(ids::get).reduce(Integer::sum).getAsInt();

注意:我知道还有其他方法可以进行上面显示的计数.我这样做是为了说明我的问题.

我正在使用SonarQube 5.3和Java 3.9插件.在该配置中,上面的代码行违反了squid规则S2095:“资源应该被关闭”.这是我期望看到AutoCloseable(例如,FileInputStream)被打开但从未关闭的结果.

所以这是我的问题:终端操作是否会减少关闭流?应该是?或者这是鱿鱼规则中的误报?

解决方法:

它没有关闭,因为AutoCloseable接口只能在try-with-resources中使用.但是IntStream完全不需要这个关闭操作,因为它在AutoCloseable接口javadoc中说:

However, when using facilities such as java.util.stream.Stream that
support both I/O-based and non-I/O-based forms, try-with-resources
blocks are in general unnecessary when using non-I/O-based forms.

所以是的,S2095是IntStream的误报.这有望在SONARJAVA-1478之前修复

上一篇:SonarQube – Android不适用于gradle 3.0.0


下一篇:【linux】【sonarqube】安装sonarqube7.9