我有两种不同的情况,在if条件中使用了布尔值。为什么我需要在CASE1中初始化变量p?
病例1:
public static void main(String[] args) {
int p;
if(Boolean.TRUE){
p=100;
}
System.out.println(p);
}
病例2:
public static void main(String[] args) {
int p;
if(Boolean.TRUE){
p=100;
}
System.out.println(p);
}
Oracle的简单答案:
局部变量略有不同;编译器从不为未初始化的局部变量的默认值。如果不能在声明本地变量的位置初始化该变量,确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。
尽管p
总是从if
语句初始化的,但编译器将调查包装器Boolean
的所有情况。解决方法:
public static void main(String[] args) {
int p;
if(Boolean.TRUE){
p=100;
} else {
p= 0; //for example. The compiler will see all the cases are covered
}
System.out.println(p);
}//no error
编译器抱怨,因为它认为有一条路径可以在System.out.println
中使用p
,而无需分配任何内容。它看到if
语句,并决定由于仅当表达式为true时才分配p
,而当表达式为false时则不分配,因此在此之后可能会取消分配p
。
当然,我们看到这一点,就会发现编译器必须非常愚蠢,因为表达式不可能是假的。好为了保持一致,并且不会出现不同供应商编写的编译器和另一供应商编写的编译程序的行为,规则必须明确编译器是什么,并且不允许"弄清楚"表达式。显然,规则并没有让它明白Boolean.TRUE
总是真的。然而,我还没有记住所有关于确定分配的规则,所以我不知道在这种情况下适用什么规则。
更多:@Ravi Jiyani评论中提到的重复问题很好地解释了我不知道的规则。
Boolean.TRUE
是一个包装对象和单例。这就是它抛出错误的原因,因为它不知道Boolean.TRUE
背后隐藏着什么。
因此,不能保证变量
p
在它打印出来。
尝试将条件更改为if(true)
,它将编译而不会出错,因为if (true)
编译器可以推断出p
在读取之前已经初始化