问题描述
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 未初始化。