为什么Java编译器会抱怨本地变量未在此处初始化?

pel*_*ele 3 java variables compiler-errors initialization variable-assignment

int a = 1, b;
if(a > 0) b = 1;
if(a <= 0) b = 2;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

如果我运行这个,我收到:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
 The local variable b may not have been initialized

 at Broom.main(Broom.java:9)

我知道局部变量没有初始化,你有责任这样做,但在这种情况下,第一个if不初始化变量?

pol*_*nts 14

如果更改第二ifelse,那么编译器会很高兴.

int a = 1, b;
if(a > 0) b = 1;
else b = 2;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

如果你真的想深入研究这个问题,Java语言规范的一整章专门讨论定义赋值问题.这种情况与您的具体示例有关:

规则不接受变化:

void flow(boolean flag) {
        int k;
        if (flag)
                k = 3;
        if (!flag)
                k = 4;
        System.out.println(k);  // k is not "definitely assigned" before here
}
Run Code Online (Sandbox Code Playgroud)

因此编译此程序必然会导致编译时错误.

这个特殊的例子(以及许多其他说明性的例子)可能似乎违背了你的期望,但这正是语言设计者想要的方式,所有编译器都必须遵守规则.

  • 也可以将`a`改为`final`而不是改为`else`来编译代码; 编译器会优化ifs,有效地除了`final int a = 1,b = 1;`之外别无其他 (2认同)

Pad*_*rag 5

专注于"IF",编译器无法判断条件是否为真.

  • 这只是语言规范中规定的规则,我担心.整章都是专门讨论这个主题的,关于何时明确分配/未分配变量的规则非常明确.有些人可能无视你的直觉,但这只是设计师想要的方式. (3认同)