最终变量赋值错误

时间:2013-06-24 07:24:48

标签: java compiler-errors final

我不知道这是不是一个愚蠢的问题,但请尽量回答。

public static void main(String[] args){
    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    x=2;
}

我有一个最终变量x。

现在要为x赋值,我有一个if语句分配它并退出程序。

现在永远不会达到最后一个语句,因此该程序应该逻辑编译。

x的值为1或2,具体取决于if语句。如果'if'为真,则不会达到最后一个语句,如果为false,则永远不会达到'x = 1'语句。

那为什么这会给我一个'local'变量的编译错误?

编辑:

是的,我显然知道最终陈述只能分配一次。

我怀疑的是,在执行过程中只会发出其中一条陈述,所以看一下程序只有一个赋值语句。

5 个答案:

答案 0 :(得分:2)

Final is Final 

声明并分配后,您无法再次分配。

最后的作业是一个编译时间检查。即使你要退出函数,它仍然会履行职责:)。

答案 1 :(得分:1)

一旦你将一些变量声明为final,你就不能为它赋值

答案 2 :(得分:1)

编译器不知道System.exit的任何其他功能。它假定,执行将继续。

在System.exit之后添加return,它将编译。

答案 3 :(得分:1)

  

x的值为1或2,具体取决于if语句。如果'if'是   如果未达到最后一个语句,则为true,如果为false,则为“x = 1”   声明从未到达。

事实并非如此,因为您没有if后跟else

此外,由于System.exit(0)仅仅是一个函数调用而不是一个不同的代码路径,因此Java编译器会假定其后面的代码为非常可访问。有关更多清晰度,请参阅此thread

就最终变量而言,不能 分配两次

以下代码可以正常运行,因为i==0可以是truefalse,而x只能分配一次

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }

答案 4 :(得分:0)

有一个概念“Definite Assignment”是java。就是这样。

Java编译器必须执行特定的保守流分析,以确保对于本地变量或空白最终字段f的每次访问,f在访问之前是明确分配的;否则必须发生编译时错误。

明确赋值背后的想法是,必须在访问的每个可能的执行路径上发生对局部变量或空白最终字段的赋值。分析考虑了陈述和表达的结构;它还提供了表达式运算符!,&&,||和?的特殊处理。 :和布尔值常量表达式。

现在我已经提到流量分析会检查确定分配,并且它会在您的案例中的 if 子句中发生,而在您之外再次尝试更改 x 的值这是不允许的......