2010-03-02 57 views
1

我有方法,所有传播异常,然后我在一个地方处理,但我意识到一些事情。如何正确关闭资源?

比方说,我有这样的

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

我的问题是,如果异常是由doSometing抛出()方法的声明不会被关闭的方法,但我不想处理异常那里。是否有正确的方法试图捕捉到只会重新抛出异常并最终结束语句?

+0

尝试,终于.... – Tronic 2010-03-02 11:19:33

回答

6
public void foo() throws Exception e { 

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

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

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

不需要把catch块添加的方法已经声明抛出异常。你可以尝试一下没有捕获的块 – Lombo 2010-03-02 11:38:09

+0

为什么你会在这里捕捉并重新抛出?尝试......终于正常工作,没有重新抛出。 http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2 – 2010-03-02 11:40:37

+0

我错过了签名中的提示,我以为问题是如果它是有效的扔catch块中还有一个例外。 – HeDinges 2010-03-02 13:19:39

1

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

public void foo() throws Exception e { 

    final Statement stmt = createStatemnt(); 

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