假设以下功能:
public void close() throws SQLException {
if (rs != null) { rs.close(); }
if (ps != null) { ps.close(); }
if (connection != null){ connection.close(); }
}
如果我尝试关闭rs并且它失败了,我的其余代码是否仍然执行(即异常会在结尾处抛出),或者它是否立即中断该函数(从而阻止ps和连接获取正确关闭)。
答案 0 :(得分:5)
如果异常发生在rs.close
,则抛出异常。如果您希望执行其他语句,则需要使用finally
。如果您怀疑将抛出另一个异常,您可以创建一个函数,例如closeQuietly
,如果您认为可以安全地忽略异常,它将会确认但放弃异常。例如(来自此answer),
protected void closeQuietly( Resource resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during Resource.close()", ex );
}
}
答案 1 :(得分:2)
当rs.close()
抛出异常时,其余的行不会被执行。被捕获的异常将传播。
如果您希望其他语句不与其他语句中断,请为每次结束使用单独的try / catch块。
您可以创建一个实用程序方法来关闭资源,然后使用资源调用该方法。由于AutoCloseable
是Connection
,Statement
,ResultSet
的超级界面,因此您可以定义如下所示的实用程序方法
public static void closeQuietly(AutoCloseable resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during closing the resources", ex );
}
}
答案 2 :(得分:1)
你需要将你想要执行的行放在finally语句中,finally语句将在抛出异常之前执行你想要的操作。您还可以检查autocloseable接口
答案 3 :(得分:1)
如果第一条指令调用异常,则不会进一步执行程序的其余部分。要解决finally
- 块被引入异常处理。在那里你可以释放任何资源。
答案 4 :(得分:1)
这正是Java 7 try-with-resources新功能的用途!
你只需这样使用它:
try (
final Type1 rs = ...;
final Type2 ps = ...;
final Connection connection = ...
) {
...
... // usefull code here
...
}
catch (...) {
// exception handling
}
并且自动所有在任何情况下都会关闭(如果您的有用代码抛出异常或者它没有抛出),则处理所有异常,并使块保持一致状态。唯一的问题是所有类(Type1
,Type2
,Connection
)都必须实现Autocloseable
接口。