java sonarqube:try-with-resources或close this“ObjectInputStream”in a“finally”clause for this code false positive?

uurity8g  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(450)

对于下面的java代码,尽管resource在finally块中被关闭,但sonar正在报告:使用try-with-resources或在“finally”子句中关闭此“ObjectInputStream”。

FileInputStream fileInputStream = null;
ObjectInputStream objIn = null;
try {
    fileInputStream = new FileInputStream(value);
    objIn = new ObjectInputStream(fileInputStream)
}
finally {
        try 
            {
            if (fileInputStream != null) {
                fileInputStream.close();
            }
            if (objIn != null) {
                objIn.close();
            }
        } catch (IOException e) {}
    }

当使用try-with-resources时,Sonar没有报告上述问题,因为我使用的java版本不支持try-with-resource,我不得不在finally块中关闭资源。

m1m5dgzv

m1m5dgzv1#

这不是假阳性。
如果fileInputStream.close()抛出异常,则不会调用objIn.close(),也不会关闭ObjectInputStream
您应该将两个close调用分开,以确保两个流都已关闭:

finally {
    try {
        if (fileInputStream != null) {
            fileInputStream.close();
        }
    } catch (IOException ignored) {}

    try {
        if (objIn != null) {
            objIn.close();
        }
    } catch (IOException ignored) {}
}
nom7f22z

nom7f22z2#

finally是 * 在 * try时,在现实中,它必须在外面。

try {
  fileInputStream = new FileInputStream(value);
  objIn = new ObjectInputStream(fileInputStream)
} finally {
  try {
    if (fileInputStream != null){
      fileInputStream.close();
    }
    if (objIn != null){
      objIn.close();
    }
  } catch (IOException ignored) {}
}

虽然我不确定SonarQube是否会理解你关闭了它。

相关问题