1

我有一个IncomingTrackHandlerFactory( ith) 分发IncomingTrackHandler. 这些实例实现AutoCloseable. 与IncomingTrackHandler数据库打交道,并且是短暂的。每个实例仅用于几个查询,然后被丢弃。

我不明白为什么第一个代码块不起作用。为什么Java告诉我它“找不到符号ithith如果发现异常并且必须回滚数据库事务,我只是在 try 块之前声明 ith 以便能够在手边也有变量。

我错过了什么?


非工作代码


工作代码


4

2 回答 2

1

您的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

于 2017-03-13T12:38:03.867 回答
1

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

从文档

因为 BufferedReader 实例是在 try-with-resource 语句中声明的,所以无论 try 语句是正常完成还是突然完成(由于方法 BufferedReader.readLine 抛出 IOException),它都会被关闭。

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

于 2017-03-13T11:52:15.860 回答