错误:可能已经分配了变量。为什么要用“可能”这个词?

时间:2014-05-04 09:43:51

标签: java compiler-errors final

当我在以下代码上运行javac编译器时 -

void method() {
    final int x;
    x = 1;
    x = 1;  // (Intentional error)
}

我收到以下错误 -

..\src\pkgs\main\Main.java:60: error: variable x might already have been assigned
                x = 1;  // (Intentional error)
                ^

我想知道为什么这条错误消息会使用"可能"这个词。更准确的描述会使用"有"相反,如在"已被分配"?是否有一个特殊的原因,为什么编译器似乎使用了一种模糊的描述风格"对于这种类型的错误?感谢。

2 个答案:

答案 0 :(得分:12)

final变量只有在definitely unassigned时才能分配。也就是说,"可能" 指的是变量 not 绝对未分配的事实:

  

同样,每个空白的最终变量最多只能分配一次; 当发生对它的赋值时,必须明确地取消分配

例如,考虑一下这个代码,它会使"的措辞成为"更清楚:

final int x;
if (maybeTrueOrMaybeFalse()) {
   x = 1;
}
/* error: variable x might already have been assigned */
x = 1;

标准的Sun / Oracle javac编译器为"可能"生成相同的错误消息。 (并非绝对未分配)和"已经" (明确分配)案件。不同的编译器或代码分析工具可以很好地在"中提供不同/精炼的消息。情况下。

答案 1 :(得分:1)

如果您在声明时初始化它,它会给您一个准确的信息,例如

  

“无法分配最终的局部变量x。它必须是空白的   不使用复合作业“

final int x = 6;
// code
x = 4;

但是,在您的示例中,最终变量可能已在声明后在某处初始化,并且编译器不跟踪连续语句,否则它将被命名为“runner”并且它只有最终变量x不应该初始化两次的信息。