为什么 Java 抱怨我的 try-with-resources 块?

Why is Java complaining about my try-with-resources block?

我有一个 IncomingTrackHandlerFactory (ith),它分发 IncomingTrackHandler 的实例。这些实例实现 AutoCloseableIncomingTrackHandler 处理数据库,并且是短暂的。每个实例仅用于几个查询然后被丢弃。

我不明白为什么第一段代码不起作用。为什么 Java 告诉我 "cannot find symbol" 对于 ith?我只是在 try 块之前声明 ith,以便在异常严重且数据库事务必须回滚时也能够手头有 ith 变量。

我错过了什么?




据我所知,必须在 try-with-resources 块中声明资源,就像在第二个示例中所做的那样。

来自文档

Because the BufferedReader instance is declared in a try-with-resource statement, it will be closed regardless of whether the try statement completes normally or abruptly (as a result of the method BufferedReader.readLine throwing an IOException).

更多信息在这里:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

您的 ith 对象仅在您的 try 块内可见,并且是 AutoCloseable 的一个实例。该实例在外部不可见,无论是在 catch、finally 还是 catch 块中。 ith 资源在抛出异常或 try 块完成时自动关闭。虽然可以捕获异常本身,但不能对 ith 对象本身进行操作,只能在 try 块内部进行操作。

要使用 rollback 函数,您必须在其中声明另一个 try-catch 块。 (原代码示例因源码为图片格式省略)

try(Object<AutoCloseable> smth = source.get())
{
   try {
       // operate on smth
   } catch (Exception e)
   {
      smth.rollback();
   }
}

有关详细信息,请查看 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html