在Java中,在抛出异常的方法中关闭变量的正确方法是什么?

时间:2016-02-27 00:03:56

标签: java exception-handling

在Java中,我经常关闭finally块中的变量,如下所示:

public void someMethod(){
  InputStream inStream = null;
  PreparedStatement pStatement = null;

  try{ do something here }
  catch(Exception ex){ do something here }
  finally{
    try{ if (inStream != null) inStream.close(); } catch(Exception ex){/* do nothing */}
    try{ if (pStatement != null) pStatement.close(); } catch(Exception ex){/* do nothing */}
  }
}

我想知道,如果方法说它抛出一个异常,那么有一个像#"最后"我可以关闭方法的变量? 例如:

public void anotherMethod() throws SQLException {
  // This method doesn't need a try/catch because the method throws an exception.
  InputStream inStream = null;
  PreparedStatement pStatement = null;

  // Where can I ensure these variables are closed?
  // I would prefer not to have them be global variables.
}

1 个答案:

答案 0 :(得分:5)

正确的方法实际上是使用Java 7中引入的try-with-resources构造。

public void anotherMethod() throws SQLException {
    try (PreparedStatement st = connection.prepareStatement(...)) {
        // do things with st
    }
}

这确保了try块中发生的任何事情(成功执行或以异常结束),资源将被关闭。您不需要添加catch部分,因为该方法会抛出SQLException,更重要的是,您不需要添加finally子句:所有打开的资源都保证在该声明之后被关闭。