【发布时间】:2021-06-12 14:00:25
【问题描述】:
为什么下面的x没有初始化?
public class rough {
public static void main(String[] args) {
int x;
boolean found = false;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.5) {
found = true;
x = 10;
break;
}
}
if (!found)
x = -1;
System.out.println(x);//x isn't initialized here
}
}
平均而言,对于一半的迭代,for 循环内的if 将是true,因此初始化x。对于另一半,found 保持false,因此外部if 将初始化。因此,我不明白为什么编译器会生气。
作为最终的蒸馏(参见下面的连续简化),考虑
public static void main(String[] args) {
int x;
boolean found = false;
if (!found)
x = -1;
System.out.println(x);
}
这也给出了x不是初始化的错误。
以前的简化
更令人惊讶的是,变化
if (Math.random() < 0.5) 到 if(true) 也有同样的问题。
事实上,进一步调查,用这些替换原来的for循环
for (int i=0;i<1;i++)
x = 10;
for (; !found; ) {
x = 10;
break;
}
同样糟糕。只有 for(;;){... break;} 和 for(;true;){... break;} 不会引发任何初始化。错误。
【问题讨论】:
-
编译器并没有走那么远就能理解 x 值与找到的布尔值相关联
-
@azro thnx 快速回复..我实际上使用的是 intellij IDE...我认为它在逻辑地执行代码后显示构建错误
-
因为你知道输入的类型,而编译器不能确定
x是否总是有一个分配给它的值。因此,它警告您在使用它之前对其进行初始化,例如int x = 0; // or any value for that matter -
@akuzminykh 没有导致
x未初始化的代码路径,但编译器没有感知能力,并且使用外部boolean保护变量进行流控制检测对它来说有点太多了分析(可怜的东西)。 -
对。知道 'x' 被有效设置需要跟踪,如果 x 未在循环中设置,则 found 仍然为 false,因此 x 将在循环后设置。这要求有点多。
标签: java initialization