Java SonarQube问题:方法可能无法清除已检查异常的流或资源
我代码中的以下语句被SonarQube标记为一个关键问题。 stmt=conn.createStatement() 确切的问题是,“方法可能无法清除选中异常的java.sql.Statement” 下面的代码片段:Java SonarQube问题:方法可能无法清除已检查异常的流或资源,java,eclipse,sonarqube,Java,Eclipse,Sonarqube,我代码中的以下语句被SonarQube标记为一个关键问题。 stmt=conn.createStatement() 确切的问题是,“方法可能无法清除选中异常的java.sql.Statement” 下面的代码片段: . . . try{ . . . **stmt=conn.createStatement();** . . . } catch (SQLException e) { ...exception logged... }
.
.
.
try{
.
.
.
**stmt=conn.createStatement();**
.
.
.
} catch (SQLException e) {
...exception logged...
} catch (NullPointerException e) {
...exception logged...
}finally{
try {
if(rs != null)
{
rs.close();
}
} catch (SQLException e) {
...exception logged...
}
if(stmt != null)
{
try {
stmt.close();
} catch (SQLException e) {
...exception logged...
}catch (NullPointerException e) {
...exception logged...
}
}
if(conn != null)
{
try {
conn.close();
} catch (SQLException e) {
...exception logged... }
}
}
.
.
.
SonarQube显示的规则如下:
方法可能无法清除选中异常的流或资源
此方法可能无法清理(关闭、处置)需要显式清理操作的流、数据库对象或其他资源。
通常,如果一个方法打开了一个流或其他资源,那么该方法应该使用try/finally块来确保在该方法返回之前清除该流或资源。
这个bug模式本质上与OS_OPEN_STREAM和ODR_OPEN_DATABASE_RESOURCE bug模式相同,但基于不同(希望更好)的静态分析技术。有关分析技术的描述,请参阅Weimer和Necula,查找和防止运行时错误处理错误。
findbugs:OBL\u未满足的义务\u异常\u边缘Sep12可靠性>异常处理
我已经关闭了所有连接、语句和结果集。
这里可能有什么问题?从这条消息中,方法可能无法清除选中异常的java.sql.Statement,我怀疑您是特定异常,如NPE或SqlException。尝试捕获整个异常,并尝试它是否有效。参考如下
try {
if(rs != null)
{
rs.close();
}
} catch (Exception e) {
...exception logged...
}
if(stmt != null)
{
try {
stmt.close();
} catch (Exception e) {
...exception logged...
}
}
if(conn != null)
{
try {
conn.close();
} catch (Exception e) {
...exception logged... }
}
您使用的是哪个版本的Java?如果是Java 7,请尝试感谢@VinodJayachandran您能为Java 6提供一些建议吗?再次感谢@VinodJayachandran,但这也不起作用。