当我在以下代码上运行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)
^
我想知道为什么这条错误消息会使用"可能"这个词。更准确的描述会使用"有"相反,如在"已被分配"?是否有一个特殊的原因,为什么编译器似乎使用了一种模糊的描述风格"对于这种类型的错误?感谢。
答案 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不应该初始化两次的信息。