2010-03-02 5 views
1

У меня есть методы, которые распространяют исключения, а затем у меня есть обработка на одном месте, однако я кое-что понял.Как правильно закрыть ресурсы?

Скажем, у меня есть метод, как этот

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

Моя проблема заключается в том, что если исключение на doSometing метод() заявление не будет закрыто, но я не хочу, чтобы обрабатывать исключения там. Правильный подход - попробовать и поймать, что только вызывает исключение и, наконец, закрыть инструкцию?

+0

примерки наконец .... – Tronic

ответ

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

нет необходимости добавлять, что поймать блок как метод уже заявляет, что бросает исключение. У вас может быть блок try-finally без catch – Lombo

+0

Зачем вам мешать ловли и реинтронировать здесь? попробуйте ... наконец, отлично работает без ретрова. http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20.2 –

+0

Я пропустил броски в подписи, я подумал, что вопрос был: Если было правдиво бросать исключение далее в блоке catch. – HeDinges

1

Модификация nos ответ. Вы действительно можете инициализировать stmt перед тем, как попробовать блок. Таким образом, нет необходимости, чтобы увидеть, если это null, так что это просто хватает:

public void foo() throws Exception e { 

    final Statement stmt = createStatemnt(); 

    try { 
    doSomething(stmt); 
    } finally { 
    stmt.close(); 
    } 
} 
Смежные вопросы