为什么我为此编译错误?

时间:2018-03-10 07:34:14

标签: java

class Example{
    public static void main(String args[]){
    final int x=100;
    final int y;
    y=100;
    int z=100;
    int a,b,c,d;
    if(x>0){a=0;}
    if(y>0){b=0;}
    if(z>0){c=0;}
    if(100>0){d=0;}
    System.out.println(a);//Line 1 
    System.out.println(b);//Line 2
    System.out.println(c);//Line 3
    System.out.println(d);//Line 4
    }
}

我是Java的初学者。当我编译上面的代码时,我在第2行和第2行中有一条错误消息。第3行。我想知道原因。

2 个答案:

答案 0 :(得分:5)

在Java中,在没有初始化程序的情况下声明的所有局部变量在使用之前都需要明确赋值。例如:

int x = 1;
int a;
if (x == 1) {
   a = 1;
}
System.out.println(a);  // ERROR

明确赋值的规则是严格的。它们基本上意味着必须通过语法允许的代码的所有可能路径进行分配。

因此,在上文中,语法允许不执行“then”分支的路径。现在你和我知道这是不可能的。但是语法允许它,因此编译器必须将其称为编译错误。

明确分配的规则在JLS的Chapter 16中以极其详细的方式列出。 if语句的规则位于16.2.7。如果您花时间详细阅读规则,您会看到将x声明为final使x > 0成为“布尔值常量表达式”。这允许编译器确定示例中的a是明确分配的。

Java具有这些严格/迂腐规则的原因是Java编译器编写者不需要在编译器中实现复杂的(并且最终难以处理的)定理证明逻辑。对于上面的示例,证明是简单明了的,但是可以构造示例,其中在数学上不可能来证明赋值将会发生或不会发生。

答案 1 :(得分:1)

您必须初始化变量b和c的值。

class Example{
    public static void main(String args[]){
    final int x=100;
    final int y;
    y=100;
    int z=100;
    int a,b = 0,c = 0,d;
    if(x>0){a=0;}
    if(y>0){b=0;}
    if(z>0){c=0;}
    if(100>0){d=0;}
    System.out.println(a);//Line 1 
    System.out.println(b);//Line 2
    System.out.println(c);//Line 3
    System.out.println(d);//Line 4
    }
}