什么时候"抛出异常"抛出?

时间:2014-04-29 13:20:04

标签: java exception-handling

假设以下功能:

public void close() throws SQLException {
    if (rs != null) { rs.close(); }
    if (ps != null) { ps.close(); }
    if (connection != null){ connection.close(); }
}

如果我尝试关闭rs并且它失败了,我的其余代码是否仍然执行(即异常会在结尾处抛出),或者它是否立即中断该函数(从而阻止ps和连接获取正确关闭)。

5 个答案:

答案 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块。

您可以创建一个实用程序方法来关闭资源,然后使用资源调用该方法。由于AutoCloseableConnectionStatementResultSet的超级界面,因此您可以定义如下所示的实用程序方法

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
}

并且自动所有在任何情况下都会关闭(如果您的有用代码抛出异常或者它没有抛出),则处理所有异常,并使块保持一致状态。唯一的问题是所有类(Type1Type2Connection)都必须实现Autocloseable接口。