如何正确关闭资源?

时间:2010-03-02 11:18:14

标签: java exception-handling

我有方法都传播异常然后我在一个地方处理,但我意识到了。

假设我有这样的方法

public void foo() throws Exception e {
  Statement stmt = createStatement();
  doSomething(stmt);
  stmt.close();
}

我的问题是,如果doSometing()方法抛出异常,语句将不会被关闭,但我不想在那里处理异常。是尝试捕获的唯一方法是只重新抛出异常并最终关闭语句吗?

4 个答案:

答案 0 :(得分:6)

public void foo() throws Exception e {

  Statement stmt = null ; 
  try {
    stmt = createStatement();
    doSomething(stmt);
  } finally {
    if(stmt != null) 
      stmt.close();
  }
}

答案 1 :(得分:2)

在finally块中关闭它。所有打开的资源都应该被释放/关闭。
有关详情,请参阅此内容 - http://www.ibm.com/developerworks/java/library/j-jtp03216.html

答案 2 :(得分:1)

修改为nos回答。实际上,您可以在尝试阻止之前初始化 stmt 。这样就没有必要查看它是null,所以这就足够了:

public void foo() throws Exception e {

  final Statement stmt = createStatemnt( );

  try {
    doSomething(stmt);
  } finally {
    stmt.close();
  }
}

答案 3 :(得分:-1)

是的,你可以进一步抛出异常

try {
   stmt = createStatement();
   doSomething(stmt);
}
 catch (Exception e) {
    throw e;
}
finally {
   if(stmt != null) 
      stmt.close();
}