【发布时间】:2017-10-12 17:16:58
【问题描述】:
假设我有以下代码
int myVar;
final boolean condition = <someCondition>;
if (condition) {
myVar = 1;
}
if (condition) {
System.out.println("myVar = " + myVar);
}
当我编译这个时,我得到了预期的myVar might not have been initialized 错误。
这是编译器中的错误吗?很容易看出“myVar”是在condition 为真时设置的,并且仅在condition 为真时才被引用。 (condition 也永远不会重置)
P.S:对于那些需要将其初始化为 0 的 cmets,是的,我知道这一点。但关键是,我希望“myVar”是最终的(即,最多设置一次值)
【问题讨论】:
-
@imk 很明显,OP 已经知道这一点,因为问题的重点是关于 为什么 编译器需要初始化。
-
Java 编译器根本没有进行足够深入的分析来得出结论,在使用变量
myVar之前总是将值分配给它。通常,它不会尝试关联不同条件语句中的条件。 -
我不认为编译器知道条件不会改变。举个例子,这是在中断的 CPU 上运行的。当它返回执行此操作时,条件可能会发生变化。没关系,我没有看条件声明。 @JohnBollinger 似乎已经足够了。
-
很感兴趣,我尝试了这个特定的场景,它在 jdk1.8.0_141 中使用 javac 编译并运行没有问题。
-
@d.j.brown 那是因为您将编译时常量
true分配给了condition。如果你用运行时值初始化它,它会失败。
标签: java variables compiler-errors variable-initialization javacompiler