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

时间:2012-02-17 07:09:11

标签: 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);
    }
}

它没有编译并且说“变量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);
    }
}

编辑2:

如果我实际上为else部分提供了另一个条件,它看起来像是给了我同样的错误,这样就可以了:

if (x == 0) {
    y = 1;
}
else if (x == 1) {
    y = 2;
}

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

7 个答案:

答案 0 :(得分:10)

局部变量没有默认值,您需要初始化它们。您当然设置了x(x=0)的值,但编译器不会检查是否实际输入了循环体。因此,请y赋值0

答案 1 :(得分:5)

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

答案 2 :(得分:1)

这是错误的:

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

这是正确的:

public class Foo {
    public static void main (String[] args) {
        int x, y; // Declaration only: x and y are uninitialized

这也是正确的:

public class Foo {
    public static void main (String[] args) {
        int x = 1, y = 10; // Declaration + initialization

'希望有所帮助......

答案 3 :(得分:1)

直到运行时才能确定for循环是否会运行一次。因此,初始化不计数(即,编译器不能依赖它,因此它会出错)。

直到运行时才能确定两个中的哪一个 - ifelse子句 - 将会触发。但是,在编译时我们知道一个或另一个将触发,所以如果你在两者中初始化,编译错误就会消失。

答案 4 :(得分:1)

这取决于两件事:

  • 执行无论什么(此处为“x”)
  • 基于某些约束(此处为“y”)执行

编译器在任何情况下都会排斥歧义,因此它会在有条件执行的块中见证变量初始化时抛出错误。

答案 5 :(得分:0)

x在for循环(第一个参数)中初始化

答案 6 :(得分:0)

考虑如果你的循环是

会发生什么
for (x = 0 ; x < someOtherVariable ; x++) {

并且someOtherVariable的值恰好为零。该循环根本不会运行,因此永远不会初始化y

当然,你编写的循环总是运行十次,因为下限和上限都是硬编码的,但编译器(显然)并没有足够的分析代码来证明。它看到一个仅在循环中初始化的变量,并且遵循循环可能根本不运行的一般规则,它会抱怨变量可能没有被初始化。

BTW,int = x, y;是无效的Java语法:等号不属于那里。

相关问题