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

Bob*_*oss 10 java java-8 sonarqube

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

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

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

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

所以这是我的问题:终端操作是否reduce关闭流?应该是?或者这是鱿鱼规则中的假阳性?

And*_*niy 9

它没有关闭,因为AutoCloseable界面只在里面工作try-with-resources.但是这个关闭操作完全没必要,IntStream因为它在AutoCloseable界面中说javadoc:

但是,当使用支持基于I/O和非I/O的表单的java.util.stream.Stream等工具时,在使用非I/O时通常不需要try-with-resources块.基础表格.

所以是的, S2095 IntStream的误报.希望由SONARJAVA-1478修复

  • 静态分析不会检测到错误; 它会检测可能存在错误的内容,并且可能值得一看.在这种情况下,您查看它,并确定它不是一个错误,因为流不包含需要释放的资源. (5认同)
  • @BrianGoetz我们尽力避免浪费用户时间不看不值得的不值得的东西:) (5认同)
  • @BobCross这听起来确实是假阳性.我们必须微调此规则以排除实际上不持有资源的类型.在某些情况下,这最终会变得非常棘手.我想在实际打开一张票来处理这个案子之前仔细看看,但我会把它链接到这个问题 (4认同)
  • @BobCross这确实是一个误报.Java 8中的"AutoClosable"接口发生了变化,现在"AutoClosable"可能实际上并没有关闭资源. (3认同)
  • @benzonico好.我想你想回去寻找流源(如果可以的话)并根据它做出决定.我将重点关注文件(walk,lines等)中的静态流工厂方法作为资源持有者.我不担心像BufferedReader.lines()这样的方法,因为在这种情况下,流不是主要的资源持有者,它是BufferedReader,而这就是需要关闭的东西(关闭结果流并不会关闭BR无论如何.) (3认同)
  • @Tunaki更确切地说,"AutoCloseable"意味着*可以*通过资源尝试自动关闭.并非所有可关闭实体实际上都需要*关闭.(并且,这对于Java 8来说并不新鲜; ByteArrayInputStream已经永远存在,并且它也不需要关闭.) (2认同)