Java 如何正确关闭资源?

Java 如何正确关闭资源?,java,exception-handling,Java,Exception Handling,我有所有传播异常的方法,然后我在一个地方处理,但是我意识到了一些事情 假设我有这样的方法 public void foo() throws Exception e { Statement stmt = createStatement(); doSomething(stmt); stmt.close(); } 我的问题是,如果doSometing()方法抛出异常,语句将不会关闭,但我不想在那里处理异常。让try-and-catch只返回异常并最终关闭语句是正确的方法吗?在finall

我有所有传播异常的方法,然后我在一个地方处理,但是我意识到了一些事情

假设我有这样的方法

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

我的问题是,如果doSometing()方法抛出异常,语句将不会关闭,但我不想在那里处理异常。让try-and-catch只返回异常并最终关闭语句是正确的方法吗?

在finally块中关闭它。应释放/关闭所有打开的资源

有关更多信息,请参见此-

在finally块中关闭它。应释放/关闭所有打开的资源

有关详细信息,请参见此-

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

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

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

try {
   stmt = createStatement();
   doSomething(stmt);
}
 catch (Exception e) {
    throw e;
}
finally {
   if(stmt != null) 
      stmt.close();
}
修改答案。实际上,您可以在try块之前初始化stmt。这样就不需要查看它是否为
null
,因此这就足够了:

public void foo() throws Exception e {

  final Statement stmt = createStatemnt( );

  try {
    doSomething(stmt);
  } finally {
    stmt.close();
  }
}
修改答案。实际上,您可以在try块之前初始化stmt。这样就不需要查看它是否为
null
,因此这就足够了:

public void foo() throws Exception e {

  final Statement stmt = createStatemnt( );

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

不需要添加那个catch块,因为方法已经声明抛出异常。你可以在没有捕手的情况下尝试最后一次拦截。为什么你要费心在这里捕手并重新拦截?尝试最终,无需重新调整即可正常工作。我错过了签名中的抛出,我认为问题是在catch块中进一步抛出异常是否有效。不需要添加catch块,因为方法已经声明抛出异常。你可以在没有捕手的情况下尝试最后一次拦截。为什么你要费心在这里捕手并重新拦截?尝试最终,无需重新调整即可正常工作。我错过了签名中的抛出,我想问题是在catch块中进一步抛出异常是否有效。