我的代码中的以下陈述被SonarQube红色标记为一个关键问题。 语句= conn.createStatement();
确切的问题是,“方法可能无法在已检查的异常上清除java.sql.Statement”。
以下代码段:
.
.
.
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可靠性>异常处理
我已关闭所有连接,语句和结果集。 这可能是什么问题?
答案 0 :(得分:0)
从这条消息方法可能无法清除已检查异常的java.sql.Statement ,我怀疑你是NPE或SqlException之类的特定异常。尝试将Exception作为一个整体捕获并尝试它是否有效。参考如下。
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... }
}