Вам может не понравиться этот код, но в данной ситуации он необходим. (Хотя вы можете обернуть код в такой метод, как метод closeQuietly
@fge.)
Но есть более фундаментальная проблема. Изменение someWork
для закрытия соединения в блоке finally
недостаточно для предотвращения утечки... в этой ситуации!!
Почему?
Учти это:
SomeClass sc = new SomeClass(createConnection());
// do some stuff
sc.someWork();
Вопрос 1. Что произойдет, если в коде «сделать что-нибудь» возникнет исключение?
Q2: Что произойдет, если возникнет исключение при создании/конструкции SomeClass
? (Примечание: это возможно даже с самыми простыми конструкторами. Например, OOME может быть вызван операцией new
...)
Ответ: Объект Connection утек... в обеих базах!
Исправление состоит в том, чтобы выделить ресурс (например, объект Connection) внутри или непосредственно перед try/catch/finally; например
Connection c = createConnection();
try {
// do something
} catch (SomeException e) {
// some exception code
} finally {
if (c != null){
try {c.close();} catch (SomeException e) {}
}
}
В Java 7 вы также можете написать это так:
try (Connection c = createConnection()) {
// do something
} catch (SomeException e) {
// some exception code
}
при условии, что Connection
реализует интерфейс AutoCloseable
. Версия Java 7 — это «синтаксический сахар» для более сложной реализации, которая заботится о проверке null
, вызове close()
и разумной обработке любых результирующих исключений. (JLS дает подробную информацию о том, что на самом деле делает «попробовать с ресурсом».)
Для записи:
person
Stephen C
schedule
20.06.2013