1

我不知道这是否是一个愚蠢的问题,但请尝试回答。

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

我有一个最终变量 x。

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

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

x 将具有值 1 或 2,具体取决于 if 语句。如果“if”为真,则最后一条语句不会到达,如果它为假,则永远不会到达“x=1”语句。

那么为什么这会给我一个“本地”变量已初始化的编译错误?

编辑:

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

我的疑问是在执行期间只会到达其中一个语句,因此以这种方式查看它,程序将只有一个赋值语句。

4

5 回答 5

2
Final is Final 

一旦你声明和分配,你不能再次分配它。

最后的分配是编译时检查。即使你在退出函数之前它仍然会履行职责:)。

于 2013-06-24T07:26:45.493 回答
1

一旦您将某个变量声明为 final,您就不能为其赋值

于 2013-06-24T07:27:41.213 回答
1

编译器不知道 System.exit 的任何其他内容,它是一个函数。它假定,执行将继续。

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

于 2013-06-24T07:27:58.627 回答
1

x 将具有值 1 或 2,具体取决于 if 语句。如果“if”为真,则最后一条语句不会到达,如果它为假,则永远不会到达“x=1”语句。

这不是真的,因为您没有if遵循else.

此外,由于System.exit(0)只是一个函数调用而不是不同的代码路径,Java 编译器假定它后面的代码非常可访问。请参阅此线程以获得更清晰的信息

就最终变量而言,它不能赋值两次

下面的代码可以正常工作,因为i==0可以是trueor false,并且x只分配一次

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
于 2013-06-24T07:29:40.683 回答
0

有一个“定义赋值”的概念是java。事情是这样的。

Java 编译器必须进行特定的保守流分析,以确保对于局部变量或空白最终字段 f 的每次访问,f 在访问之前肯定被赋值;否则必须发生编译时错误。

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

现在,正如我已经提到的那样,流分析会检查明确分配,并且它发生在您的情况下的if子句中,并且在您之外再次尝试更改x的值,这是不允许的......

于 2013-06-24T07:41:47.213 回答