Как правильно закрыть ресурсы? - PullRequest
1 голос
/ 02 марта 2010

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

Допустим, у меня есть такой метод

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

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

Ответы [ 4 ]

6 голосов
/ 02 марта 2010
public void foo() throws Exception e {

  Statement stmt = null ; 
  try {
    stmt = createStatement();
    doSomething(stmt);
  } finally {
    if(stmt != null) 
      stmt.close();
  }
}
2 голосов
/ 02 марта 2010

Закройте его в блоке finally. Все открытые ресурсы должны быть освобождены / закрыты.
Смотрите это больше - http://www.ibm.com/developerworks/java/library/j-jtp03216.html

1 голос
/ 02 марта 2010

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

public void foo() throws Exception e {

  final Statement stmt = createStatemnt( );

  try {
    doSomething(stmt);
  } finally {
    stmt.close();
  }
}
0 голосов
/ 02 марта 2010

Да, вы можете бросить исключение дальше

try {
   stmt = createStatement();
   doSomething(stmt);
}
 catch (Exception e) {
    throw e;
}
finally {
   if(stmt != null) 
      stmt.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...