为什么在下面提到的第一种情况下int值必须是initlize?

时间:2015-02-18 04:41:24

标签: java scjp

我有两种不同的情况,我在if条件下使用了boolean。为什么我需要在CASE 1中初始化变量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);
}

3 个答案:

答案 0 :(得分:1)

来自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

答案 1 :(得分:0)

编译器抱怨,因为它认为有p可以在System.out.println中使用if而没有被分配给任何东西的路径。它会看到p语句,并决定只有在表达式为真时才分配p,而在表达式为假时不分配,Boolean.TRUE可能{{1}}之后可能会被取消分配。

当然,我们看一下这一点,并认为编译器必须非常愚蠢,因为表达式不可能是假的。嗯...为了保持一致并且没有从一个供应商编写的编译器到另一个供应商编写的编译器的行为,规则必须具体说明编译器是什么,并且不允许&# 34;弄清楚"关于表达。显然,规则并不能让人发现{{1}}总是如此。但是,我还没有记住关于明确作业的所有规则,所以我不知道在这种情况下适用哪些规则。

更多: @ Ravi Jiyani的评论中提到的重复问题很好地解释了我不了解的规则。

答案 2 :(得分:0)

Boolean.TRUE是一个包装器对象和单例。这就是它抛出错误的原因,因为它不知道Boolean.TRUE背后隐藏着什么。

  

因此,不保证变量p之前已初始化   它打印。

尝试将条件更改为if(true)并且它将编译时没有错误,因为if (true)编译器可以推断p在被读取之前已经初始化

相关问题