Операторы Try-with-resources и return в java
Мне интересно, если поставить возвращение заявление внутри try-with-resources блок предотвращает автоматическое закрытие ресурса.
try(Connection conn = ...) {
return conn.createStatement().execute("...");
}
Если я пишу что-то вроде этого подключение закрыт? В документации Oracle указано, что:
оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце инструкции.
что произойдет, если конец оператора никогда не достигается из-за оператора return?
3 ответов
на основе учебник Oracle, "[ресурс] будет закрыт независимо от того, завершается ли оператор try нормально или резко". Он определяет abruptly
как исключение.
вернувшись внутрь try
является примером резкого завершения, как определено JLS 14.1.
ресурс будет закрыт автоматически (даже с return
оператор), так как он реализует AutoCloseable
интерфейс. Вот пример, который выводит "успешно закрыт":
public class Main {
public static void main(String[] args) {
try (Foobar foobar = new Foobar()) {
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Foobar implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("closed successfully");
}
}
мы столкнулись с проблемой, когда объект соединения jedis не закрывался, когда мы использовали try с ресурсом.
трассировка стека: Ява.ленг.Нитка.Состояние: ожидание (парковка) в Sun.разное.Опасный.парк (родной метод) - парковка для ожидания (java.утиль.параллельный.замки.AbstractQueuedSynchronizer$ConditionObject) на Яве.утиль.параллельный.замки.LockSupport.парк(LockSupport.java: 175) на Ява.утиль.параллельный.замки.AbstractQueuedSynchronizer$ConditionObject.await (AbstractQueuedSynchronizer.java: 2039) в орг.апаш.палата общин.пулу pool2.impl.LinkedBlockingDeque.takeFirst (LinkedBlockingDeque.java: 583) в орг.апаш.палата общин.пулу pool2.impl.GenericObjectPool.borrowObject (GenericObjectPool.java: 442) в орг.апаш.палата общин.пулу pool2.impl.GenericObjectPool.borrowObject (GenericObjectPool.java: 363) в редисе.клиенты.утиль.Бассейн.методу getresource(бассейн.java: 49)