我有以下代码:
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。
答案 0 :(得分:2)
不仅定义可能不会发生,变量声明超出了finally块的范围。如果在try之外声明它将停止错误。
至于为什么eclipse没有说明在错误出现时它没有被使用,我的猜测是错误掩盖了警告?它永远不会进入警告阶段,因为错误首先出现在编译过程中?
答案 1 :(得分:1)
{
和}
决定Java中构造的范围。
records
变量范围仅限于try
构造的结束括号,并且您尝试在外部使用它,即在finally
块内。这就是你收到错误的原因。
行会导致错误,因为未定义。这没关系,我可以理解,它在第一个try块中的定义有时可能不会发生。
实际上那不是原因。但它与变量的范围有关。
如果我删除了doSomethingWith(记录);然后将第一个try块中的记录变量标记为未使用!!!
Java不认为分配变量正在使用它。
错误优先于警告。
答案 2 :(得分:0)
records
在“try”块内分配,但从未读过。在不读取结果的情况下分配变量是没用的。
答案 3 :(得分:-1)
你可以在我想的尝试开始之前初始化记录,因为它正在使它成为一个空字符串。 “”