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

Java 为什么这段代码说x没有初始化,但当我们在if语句中执行print语句时,它工作正常?,java,if-statement,Java,If Statement,执行时表示x未初始化?无法理解为什么?但是执行了带注释的print语句,删除了后一条语句,那么它就可以正常工作了?您所做的是“声明”一个变量。“初始化”看起来像intx=0导致问题的不是印刷品。这是您在if块中编写的x=y语句 变量x未按照错误提示进行初始化。 在if块中,您在执行x=y时为x设置了一个值。那么,您已经初始化了变量。所以印刷品是有效的 如果没有x=y块,打印将失败,因为x未初始化。编译器会产生此问题,因为如果if case未运行,则不会将任何值初始化为x,因此会产生错误 尝试使用

执行时表示x未初始化?无法理解为什么?但是执行了带注释的print语句,删除了后一条语句,那么它就可以正常工作了?

您所做的是“声明”一个变量。“初始化”看起来像
intx=0

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

变量
x
未按照错误提示进行初始化。 在if块中,您在执行
x=y
时为
x
设置了一个值。那么,您已经初始化了变量。所以印刷品是有效的


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

编译器会产生此问题,因为如果if case未运行,则不会将任何值初始化为
x
,因此会产生错误


尝试使用
intx=0

它说,因为打印指令不在if块中,编译器不确定我们是否会在if块中输入y来分配x的值
为避免该错误,请使用值0初始化变量。如果代码未输入
如果
x
在到达外部打印语句之前不会初始化(因为
x
的初始化在循环内)。

自 x=y
在“if”语句中,因此它是x=10的条件赋值,错误发生在第二个print语句中,因为它在“if”语句之外,这意味着如果不满足条件并且x没有被赋值为y怎么办?那样的话,那将是一个错误。但是,如果你像int x=5那样初始化,那么它是一个初始化,而不是一个条件赋值,因此不会出现编译时错误。

所有其他答案都是正确的,但缺少一个关键元素:人工读取器和编译器之间的差异

一个人看了看代码,马上就会明白,当代码完成时,x和y都是10

编译器也可能知道这一点。这里所有的都是文本基元类型值。智能编译器可以检测此代码的结果,无需抱怨x未初始化,因为它被分配了一个值


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

欢迎使用堆栈溢出!Java编译器只允许您在所有分支路径(即使是无法到达的分支路径)都给变量一个值的情况下访问该变量。因为您的
if
语句——即使它的计算结果始终为true(当前)——有一个路径,
x
可能未初始化,所以您不能在该if语句之外使用
x
。因为您在if中指定了
x
一个值,所以可以立即在print语句中使用它(因为该行的每个路径都给出了
x
一个值)。
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);
    }
}