在下面的代码中,Java编译器在调用hasAdditionalLiberty
的行中给出了一个错误,称x0
和y0
"可能尚未初始化" 。我确实理解这是一个错误的意图,但在这种情况下,x0
和y0
必须初始化,因为它们总是通过for循环吗?
那么确定未初始化变量错误的规则究竟是什么?
int x0;
int y0;
for (int i = 0; i < 4; ++i) {
x0 = x + deltaX[i];
y0 = y + deltaY[i];
if (isOnBoard(x0, y0) && at(x0, y0) == Color.Empty) {
break;
}
}
if (!hasAdditionalLiberty(x, y, x0, y0)) {
koX = x0;
koY = y0;
}
答案 0 :(得分:2)
好吧,编译器并不知道程序流中变量值的所有内容。
然后,编译器不知道程序是否将至少进入循环一次,因此在这种情况下x0
和y0
将不会被初始化。
如果你有一个条件依赖于变量的循环:如果你将进入循环,他在runTime之前知道谁?
在这种情况下,您将遇到意外错误
if (!hasAdditionalLiberty(x, y, x0, y0)) {
koX = x0;
koY = y0;
}
您只需要使用
进行itializeint x0 = -1;
int y0 = -1;
或
int x0 = 0;
int y0 = 0;
例如。
是的,我知道在你的情况下,你有一个&#34;静态&#34;循环,因为条件是< 4
,大豆可能会有人开发一个不同的编译器来识别这个,你不会有这个错误。
有关何时出现此类错误的详细信息,请阅读this。
答案 1 :(得分:0)
循环不能保证(在编译器看来)进行一次迭代(因为编译器没有对for
循环表达式进行充分的分析)。 / p>
有关决定未初始化变量错误的规则,请参阅 JLS,第16章:
分析考虑了流程分析中语句和表达式的结构[...,然而] 表达式的值未被考虑。 (我的重点。)
答案 2 :(得分:0)
编译器不够聪明,无法确定代码是否会进入循环。即使你可以告诉代码将进入循环,代码也不能。这不是编译器的用途。
考虑以下代码:
public static void main(String... args){
int x;
if(Math.random() < .5){
x = 100;
}
System.out.println(x);
}
此代码将生成相同的编译器错误,原因完全相同。
答案 3 :(得分:0)
编译器不知道你的for循环是否肯定会运行。要阻止警告,只需初始化变量。
int x0 = 0;
int y0 = 0;