繁体   English   中英

什么时候抛出“ throws Exception”?

[英]When is “throws Exception” thrown?

假设具有以下功能:

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

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

如果该异常发生在rs.close ,则抛出该异常。 如果要执行其他语句,则需要使用finally 如果您怀疑会抛出另一个异常,则可以创建一个函数如closeQuietly ,该函数将确认但如果您认为可以安全地忽略它们, closeQuietly其丢弃。 例如(根据此答案 ),

protected void closeQuietly( Resource resource ) {
      try {
        if (resource != null) {
          resource.close();
        }
      } catch( Exception ex ) {
        log( "Exception during Resource.close()", ex );
      }
    }

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 );
      }
    }

您需要将要执行的行放在finally语句中,finally语句将执行您想要的操作,然后引发异常。 您还可以检查自动关闭界面

如果第一条指令调用了异常,则程序的其余部分将不再执行。 为了解决该finally -块被引入到异常处理。 您可以在那里释放任何资源。

这正是Java 7 try-with-resources新功能的作用所在!

您只需以这种方式使用它:

try (
    final Type1 rs = ...;
    final Type2 ps = ...;
    final Connection connection = ...
) {
    ...
    ... // usefull code here
    ...
}
catch (...) {
    // exception handling
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM