在java中尝试使用资源和返回语句

我想知道在try-with-resources块中放置一个return语句是否会阻止资源自动关闭。

try(Connection conn = ...) { return conn.createStatement().execute("..."); } 

如果我写这样的东西会关闭Connection吗? 在Oracle文档中,声明:

try-with-resources语句确保在语句结束时关闭每个资源。

如果由于return语句从未到达语句的结尾会发生什么?

根据Oracle的教程 ,“[资源]将被关闭,无论try语句是正常完成还是突然完成”。 它abruptly定义为exception。

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"); } } 

我们遇到了一个问题,当我们使用try with resource时,jedis连接对象没有被关闭。

stackTrace:java.lang.Thread.State:在sun.misc.Unsafe.park(Native Method)上等待(停放) – 在java停车等待<0x000000008d59e890>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) .util.concurrent.locks.LockSupport.park(LockSupport.java:175)位于org.apache.commons.pool1.impl.LinkedBlockingDeque的java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2039) .takeFirst(LinkedBlockingDeque.java:583)位于org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) )at redis.clients.util.Pool.getResource(Pool.java:49)