【问题标题】:Try with multiple resource causes a sonar qube issue尝试使用多个资源会导致声纳 qube 问题
【发布时间】:2019-12-20 22:11:11
【问题描述】:

请看代码sn-p

try (InputStream inputStream = this.getClass().getClassLoader()
                .getResourceAsStream("hello.txt");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {

但是sonarQube 投诉在上面的行下面的错误  

正确性 - 先前取消引用的值的 Nullcheck(以 BufferedReader 开头的行)。

请帮助解决此问题

【问题讨论】:

  • 我认为这不是正确的行。该错误意味着您正在执行空检查,但已经访问了该变量。你能显示更多代码吗?
  • 您是否在 try 正文中的任何位置检查 inputStream 的空值?
  • 我猜,那是因为代码分析器使用编译后的代码,并且在 try-with-resource 的情况下,it’s a mess 具有无法访问的代码和冗余检查。但是,如果这是您的问题的原因,那么好消息是您在更新到 JDK 11 时可以摆脱它,即使在为 --release 8 编译时也是如此。
  • 顺便说一句,你应该使用this.getClass() .getResourceAsStream("/hello.txt") 而不是通过类加载器。这样,访问与模块化软件兼容,因为类加载器可能有多个模块,但您通常指的是具有类模块的资源。实际上,如果您不打算在为子类执行时允许解析到不同的资源,您应该使用ActualClassName.class .getResourceAsStream("/hello.txt")

标签: java java-8 sonarqube


【解决方案1】:

这是因为getClassLoader().getResourceAsStream("hello.txt") 可以返回null,并且您在创建BufferedReader 之后使用它,而不检查空值。

【讨论】:

  • 所以这意味着,在这种情况下,我不能对资源使用 try 吗?
  • 考虑使用Files.newBufferedReader的方法
  • @ArnaudClaudel Files 中的方法适用于文件,而不适用于资源。
  • 确实如此,因此您只需将getResourceAsStream 移动到try 上方并检查空值
猜你喜欢
  • 2021-06-20
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2016-01-03
  • 2021-09-12
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多