Connection
(这可能会引发异常)Statement
(也可能抛出异常)ResultSet
中(也可以抛出)ResultSet
(例外!)Statement
(例外!)Connection
(例外!)看看这段代码:
Connection conn = null;
Statement st = null;
ResultSet set = null;
try {
conn = Database.getConnection();
st = conn.createStatement();
set = st.executeQuery("SELECT * FROM THING");
// <-- Do stuff
} catch (Exception e) {
} finally {
// Close set if possible
if (set != null) {
try {
set.close();
} catch (Exception e) {
}
}
// Close statement if possible
if (st != null) {
try {
st.close();
} catch (Exception e) {
}
}
// Close connection if possible
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
finally
块是我关闭我的东西的地方。如你所见,它非常混乱。我的问题是:这是清理这些资源的正确方法吗?
答案 0 :(得分:5)
在Java 1.7之前,您的代码是捕获可关闭资源的异常的正确方法,除了您应该捕获SQLException
而不是Exception
。
从Java 1.7开始,您可以使用the "try-with-resources" statement,它允许您在close()
块完成时声明将自动调用try
的资源,从而节省样板finally
代码。
try (Connection conn = Database.getConnection(); Statement st = conn.createStatement();
ResultSet set = st.executeQuery("SELECT * FROM THING")) {
// Your "try" code as before
}
catch (SQLException e) {
// Handle as before
}
// No "finally" to clean up resources needed!
答案 1 :(得分:1)
如果可以(至少需要Java 7)http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
,请查看资源尝试答案 2 :(得分:0)
是的,但你可以通过编写可重复使用的代码(最好是在实用程序类中)使它看起来更好
public static void close(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
// log exception
}
}
}
并在finally块中使用此方法。为Connection
和ResultSet