【发布时间】:2017-08-22 19:35:22
【问题描述】:
SonarQube 将我代码中的以下语句标记为严重问题。 stmt=conn.createStatement();
确切的问题是,“方法可能无法在检查异常时清理 java.sql.Statement”。
下面的代码sn-p:
.
.
.
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 块来确保在方法返回之前清理流或资源。 此错误模式与 OS_OPEN_STREAM 和 ODR_OPEN_DATABASE_RESOURCE 错误模式基本相同,但基于不同的(希望更好)静态分析技术。有关分析技术的描述,请参阅 Weimer 和 Necula,查找和防止运行时错误处理错误。 . findbugs:OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE Sep12 可靠性 > 异常处理
我已关闭所有连接、语句和结果集。 这可能是什么问题?
【问题讨论】:
-
您使用的是哪个版本的 Java?如果是 Java 7,请尝试 docs.oracle.com/javase/tutorial/essential/exceptions/…
-
谢谢@VinodJayachandran 你能为Java 6推荐一些东西吗?