我正在尝试执行以下if语句代码,并收到一条错误消息,指出“变量j可能尚未初始化”。
示例1:
public class PrimitiveTypesChallenge {
public static void main(String[] args) {
int i = 10;
int j;
if(i == 10) {
j = 20;
}
System.out.println(j);
}
}
我在if块中初始化了j
变量的值。
示例2:
public class PrimitiveTypesChallenge {
public static void main(String[] args) {
int i = 10;
int j;
if(i == 10) {
j = 20;
}
else {
j = 30;
}
System.out.println(j);
}
}
在两个示例中,如果条件为真,但是示例1中出现错误,示例2中没有错误。我对这两种情况感到困惑。有人可以帮助我了解其背后的整个概念吗?
在示例1中,条件始终为真
We知道这一点,但是编译器不够聪明,无法发现这一事实。我们知道这是因为我们阅读了代码并在脑海中评估了表达式i==10
。编译器不会这样做。编译器可以计算constant expressions,并且i==10
不是常量表达式,因为它涉及variable i
。
因此,编译器不知道示例1中的i==10
始终为true,因此它认为i==10
可能为false。在这种情况下,j
将不会初始化,因此会出现错误。
您可以说i==10
为i
,从而使final
为常数表达式:
final int i = 10;
因此编译器知道i
的值是常数。