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

时间:2017-03-13 11:41:31

标签: java try-with-resources autocloseable

我有一个IncomingTrackHandlerFactoryith),可以发出IncomingTrackHandler的实例。这些实例实现AutoCloseableIncomingTrackHandler处理数据库,并且是短暂的。每个实例只用于几个查询然后丢弃。

我不知道为什么第一个代码块不起作用。为什么Java告诉我"找不到ith的符号" ?我只是在try块之前声明第i个,如果异常是Caugth,并且必须回滚数据库事务,那么手头也能有ith变量。

我错过了什么?

Non working code

Working code

2 个答案:

答案 0 :(得分:1)

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

来自文档

  

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

此处有更多信息:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

答案 1 :(得分: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