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

标签 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 总是会被初始化。现在我真的明白了。谢谢!!

最佳答案

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

关于Java:对变量初始化概念感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9324254/

相关文章:

JavaFX 2 和国际化加载属性文件

c++ - 变量名中的美元符号?

python - 记录数据以及如何执行多个响应以及如何在 python 中使用变量

c - "two or more data types in declaration specifiers "错误是什么意思?

C、 "conflicting types for... "错误

java - 调用需要 API 级别 26(当前最小值为 23): java. time.Instant#now

java - Web 应用程序的国际化

MySQL 用户定义变量与 COUNT 一起使用时返回错误结果

c# - 如果将委托(delegate)定义放在另一个项目中,编译会失败吗?

java - 单独线程中的实时消息处理方法体