Eclipse
で私は理解できない警告Resource leak: 'ps' is not closed at this location
を受け取りました。
私のJava
コードでは、"ps"をプリペアドステートメントとして宣言し、それを何度も使用(およびクローズ)しています。次に、次のシーケンスを実行します。
try {
if(condition) {
ps = c.prepareStatement("UPDATE 1 ...");
} else {
ps = c.prepareStatement("UPDATE 2 ...");
}
ps.executeUpdate();
} catch (SQLException e) {
// exception handling
} finally {
if (null != ps)
try {
ps.close();
} catch (SQLException e) {
// exception handling
};
}
「リソースリーク」-警告は「更新」に表示されます-elseセクションのステートメント。 tryブロックを開始する前にps = null
を設定しても、警告はありません。
2番目のUPDATE-ステートメントがコメントアウトされている場合、警告は表示されません。
それは理解ですか、それともJava/Eclipseの問題ですか?
この警告がある場合は、使用していますJava 7.この場合、AutoClosable
を実装するリソースを自分で閉じないでください。これらのリソースはtry
ステートメントの特別な初期化セクションで初期化する必要があります。
// decide which update statement you need:
// (your if should be here)
String update = ....;
try (
ps = c.prepareStatement(update);
) {
// use prepared statement here.
} catch (SQLException) {
// log your exception
throw new RuntimeException(e);
}
// no finally block is needed. The resource will be closed automatically.
if/else
ステートメントが存在すると、警告が表示または非表示になる理由は確かにわかりません。しかし、Java 7は、上記で説明した自動クローズ可能なリソースを操作する方法を推奨しているので、これを試してください。
使用しているチェッカーに問題があると思います。
コードをinitialization
ブロックとuse
ブロックに分割します。また、初期化ブロックから例外をスローします(または早期リターンを実行します)。このように、use
ブロックの後にリソースを解放するときにnullをチェックする必要はありません
// initialization
// Note that ps is declared final.
// I think it will help to silence your checker
final PreparedStatement ps;
try {
if( bedingungen ... ) {
ps = c.prepareStatement("UPDATE 1 ...");
} else {
ps = c.prepareStatement("UPDATE 2 ...");
}
}
catch (SQLException e) {
log.error("Problem creating prepared statement, e );
throw e;
}
// use
try {
ps.executeUpdate();
} catch (SQLException e) {
log.error("Problem decrementing palets on " + srcElement.getName() +
": " + e.getMessage());
}
finally {
try {
ps.close();
} catch (SQLException e) {
log.warn("Error closing PreparedStatement: " + e.getMessage());
};
}