【问题标题】:Why is Java complaining about my try-with-resources block?为什么 Java 抱怨我的 try-with-resources 块?
【发布时间】:2017-08-03 10:02:10
【问题描述】:

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

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

我错过了什么?




【问题讨论】:

  • 请注意,这并不是真正的 Netbeans,而是 Java 编译器 告诉你的。
  • @kryger :是的 - 抱歉没有具体说明。这不是 Netbeans 的错,这只是我提出问题的(糟糕)方式。

标签: java try-with-resources autocloseable


【解决方案1】:

您的ith 对象仅在您的try 块内可见,并且是AutoCloseable 的一个实例。该实例在外部不可见,在 catch、finally 或 catch 块中均不可见。当抛出异常或try 块完成时,ith 资源会自动关闭。虽然可以捕获异常本身,但是不能对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

【讨论】:

    【解决方案2】:

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

    来自文档

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

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

    【讨论】:

    • 你的意思是我必须使用 try() 部分中的构造函数来实例化,而不是通过 try() 部分中的工厂来分发实例吗?
    • 你可以按照你喜欢的方式实例化它,但它应该在他的尝试部分中声明和实例化。
    • 好吧,我确信我以前做过这个。我假设我必须使用嵌套的 try-catch 才能在 try 部分发生故障时回滚数据库事务。
    • 您好,您可能想查看其他帖子。它有点类似于你需要的stackoverflow.com/questions/15761791/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 2013-07-21
    • 1970-01-01
    • 2011-05-11
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多