Java try-catch-finally范围,确定是否使用该变量

时间:2012-01-17 11:12:16

标签: java scope try-catch

我有以下代码:

    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();
        }
    }

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

如果重要,我的IDE就是Eclipse。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

  

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

实际上那不是原因。但它与变量的范围有关。

  

如果我删除了doSomethingWith(记录);然后将第一个try块中的记录变量标记为未使用!!!

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

错误优先于警告。

答案 2 :(得分:0)

records在“try”块内分配,但从未读过。在不读取结果的情况下分配变量是没用的。

答案 3 :(得分:-1)

你可以在我想的尝试开始之前初始化记录,因为它正在使它成为一个空字符串。 “”