Java未初始化的变量错误

时间:2015-05-07 22:54:45

标签: java

在下面的代码中,Java编译器在调用hasAdditionalLiberty的行中给出了一个错误,称x0y0"可能尚未初始化" 。我确实理解这是一个错误的意图,但在这种情况下,x0y0必须初始化,因为它们总是通过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;
}

4 个答案:

答案 0 :(得分:2)

好吧,编译器并不知道程序流中变量值的所有内容。

然后,编译器不知道程序是否将至少进入循环一次,因此在这种情况下x0y0将不会被初始化。

如果你有一个条件依赖于变量的循环:如果你将进入循环,他在runTime之前知道谁?

在这种情况下,您将遇到意外错误

if (!hasAdditionalLiberty(x, y, x0, y0)) {
    koX = x0;
    koY = y0;
}

您只需要使用

进行itialize
int 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;