我有一个IncomingTrackHandlerFactory
(ith
),可以发出IncomingTrackHandler
的实例。这些实例实现AutoCloseable
。 IncomingTrackHandler
处理数据库,并且是短暂的。每个实例只用于几个查询然后丢弃。
我不知道为什么第一个代码块不起作用。为什么Java告诉我"找不到ith
的符号" ?我只是在try块之前声明第i个,如果异常是Caugth,并且必须回滚数据库事务,那么手头也能有ith
变量。
我错过了什么?
答案 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