为什么这段代码说 x 没有初始化,但是当我们在 if 语句中执行打印语句时它工作正常?

问题描述

public class Main{
    public static void main(String[] args) {
        int x;
        int y=10;
        if(y==10){
            x=y;
            //System.out.println("x is "+x);
        }
        System.out.println("x is "+ x);
    }
}

执行时提示 x 未初始化?不明白为什么?但是注释掉的打印语句被执行了,后面的被删除了就可以正常工作了吗?

解决方法

它说这是因为打印指令在 if 块之外并且编译器不确定我们是否会进入 if 块以将 y 的值分配给 x 为避免该错误,请使用值 0 初始化变量

,

如果代码没有进入 if,那么 x 在它到达外部打印语句之前不会被初始化(因为 x 的初始化在循环内)。

,

所有其他答案都是正确的,但遗漏了一个关键要素:人类读者和编译器之间的区别。

人类查看代码后立即明白,当这段代码完成时,x 和 y 都将是 10。

编译器也可以知道这一点。这里都是文字原始类型值。 智能编译器可以检测到这段代码的结果,无需抱怨 x 没有初始化,因为它被赋值了。

但是还有很多其他情况不是那么清楚。因此,大多数编译器都非常保守。他们宁愿抱怨这样的代码是错误的,以避免不抱怨错误代码的风险。

,

编译器产生这个问题是因为可能会出现 if case 没有运行然后没有值被初始化为 x 的情况,所以这会产生一个错误。

尝试使用 int x = 0;

,

自从 x=y 在“if”语句内部,所以它是x = 10的条件赋值,错误发生在第二个print语句,因为它在“if”语句之外,这意味着如果条件不满足并且x不满足怎么办分配了 y 的值?在这种情况下,这将是一个错误。然而,如果你像 int x = 5 那样初始化,在这种情况下它是一个初始化而不是一个条件赋值,所以不会有编译时错误。

,

您正在做的是“声明”一个变量。 “初始化”看起来像 int x = 0;

,

导致问题的不是印刷品。这是您在 if 块中编写的 x=y 语句。

变量 x 未按照错误提示进行初始化。 在 if 块中,您在执行 x 时为 x=y 设置了一个值。所以,你已经初始化了变量。所以打印效果很好。

没有 x=y 块,打印失败,因为 x 未初始化。