【问题标题】:Java try-catch-finally scopes, determining if the variable is usedJava try-catch-finally 作用域,判断变量是否被使用
【发布时间】:2012-01-17 11:12:16
【问题描述】:

我有以下代码:

    try {
        reader = new BufferedReader(new FileReader(file));
        String records = "";
        System.out.println("EMITTER QUEUE BACKUP: restoring from file...");
        try {
            while(reader.ready()) {
                records += reader.readLine();
            }
        } catch (IOException e) {
            System.out.println("EMITTER QUEUE BACKUP: error restoring");
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        doSomethingWith(records);
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

doSomethingWith(records); 行中的 records 变量会导致未定义的错误。没关系,我可以理解它在第一个try 块中的定义有时可能不会出现。但是有一个问题:如果我删除doSomethingWith(records); 行,那么第一个try 块中的records 变量将被标记为未使用!!!那么为什么即使它导致明显的错误,它也能识别出它在该行中使用,因为它假定它不是同一个变量,因此它不能代表String records = "" 的用例?

如果这很重要,我的 IDE 是 Eclipse。

【问题讨论】:

  • 不,您的 IDE 与您编写的语言无关 :-)
  • 我将代码粘贴到我的 Eclipse 中,无论我是否删除 doSomethingWith(records);records 变量都未使用。这是不同的变量。你有类属性records,对吗?
  • 嗯,不,我没有这样的类属性。这段代码实际上就是这个类的所有内容(例如,除了阅读器的声明)
  • @PeterGwiazda 您可能设置了不同的编译器错误/警告设置。我在 Eclipse 中的设置与 OP 相同。
  • 这不应该编译。这里doSomethingWith(records); 变量records 不存在。

标签: java scope try-catch


【解决方案1】:

不仅仅是定义可能不会发生,变量声明超出了finally块的范围。如果在 try 之外声明,它将停止错误。

至于为什么 eclipse 在出现错误时没有声明它未使用,我的猜测是错误掩盖了警告?它永远不会进入警告阶段,因为错误首先发生在编译过程中?

【讨论】:

  • 没错,刚才我已经结束了实验,我在同一个地方声明了第二个故意未使用的变量,是的,错误掩盖了它。以前从未注意到这种行为.. 但无论如何,很高兴知道!
【解决方案2】:

{} 决定 Java 中构造的范围。

records 变量范围仅限于 try 构造的末尾大括号,并且您试图在外部使用它,即在 finally 块内。这就是你得到错误的原因。

行导致未定义的错误。没关系,我可以理解它在第一个 try 块中的定义有时可能不会出现。

其实不是这个原因。但它与变量的范围有关。

如果我删除 doSomethingWith(records);行,然后第一个尝试块中的记录变量被标记为未使用!!!

Java 不认为正在使用分配一个变量。

而且错误比警告更受欢迎。

【讨论】:

    【解决方案3】:

    records 在“try”块内分配,但从未被读取。分配一个变量而不读取结果是没有用的。

    【讨论】:

    • 没关系,我误读了这个问题。但是,如果不进行编辑,就无法编辑投票:/
    【解决方案4】:

    我想您可以在尝试开始之前初始化记录,因为您将其设为空字符串。 ""

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2011-10-31
      • 2011-11-17
      • 2011-06-01
      • 2015-09-05
      相关资源
      最近更新 更多