Java:对变量初始化概念感到困惑

Den*_*nis 3 java variables compiler-errors initialization declaration

我是Java的新手,我在理解声明的概念和变量的初始化方面遇到了一些麻烦.

例如,当我这样做时:

public class Foo {
    public static void main (String[] args) {
        int x, y;
        for (x = 0 ; x < 10 ; x++) {
           y = x + 1;
        }
        System.out.println(x);
        System.out.println(y);
    }
}
Run Code Online (Sandbox Code Playgroud)

它没有编译,并说"变量y可能没有被初始化." 但是,如果我告诉它只是在循环后打印出x值,它没有任何问题.当然,如果我在开始时简单声明它(说int y = 0;或类似的东西)它会工作,但我想知道为什么x被打印而不是y.

提前致谢!


编辑:

我知道编译器实际上并没有检查循环内部是否会初始化变量,所以它只是说它可能没有被初始化,但是为什么以下代码有效呢?编译器是否检查if循环而不是for循环?

public class Foo {
    public static void main (String[] args) {
        int x = 0, y;
        if (x == 0) {
            y = 1;
        }
        else {
            y = 2;
        }
        System.out.println(y);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

看起来它给了我同样的错误,如果我实际上为else部分给出另一个条件,那么它将是:

if (x == 0) {
    y = 1;
}
else if (x == 1) {
    y = 2;
}
Run Code Online (Sandbox Code Playgroud)

所以我猜另一个例子是有效的,因为y在if和else部分都被初始化了,这意味着无论给出的条件是什么,y都会被初始化.现在我真的明白了.谢谢!!

Boz*_*zho 10

局部变量没有默认值,您需要初始化它们.您当然设置了x(x=0)的值,但编译器不会检查是否实际输入了循环体.所以给出y一个值0.


Nav*_*ved 5

如果你查看你的代码; 你已经在for循环中将x初始化为0,然后用x ++递增它.但是你正在初始化Y内部循环,这可能会或可能不会在运行时执行(与编译时无关).在Java中,您必须在使用之前初始化局部变量,如果您不这样做,编译器将提示错误.这就是x被打印而不是Y的原因