【问题标题】:Final variable assignment error最终变量赋值错误
【发布时间】:2013-06-20 15:21:08
【问题描述】:

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

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' 为真,则不会到达最后一条语句,如果为假,则永远不会达到 'x=1' 语句。

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

编辑:

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

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

【问题讨论】:

  • 查看关于 java 中定义赋值的评论

标签: java compiler-errors final


【解决方案1】:
Final is Final 

一旦你声明并赋值,你就不能再赋值了。

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

【讨论】:

  • 是的,但我并没有真正重新分配它。它在程序过程中只分配一次。
  • x=2;赋值语句对吗??这里的可能性是添加一个 else 条件并在那里分配。
  • 但是当执行发生时只到达这些语句中的一个
  • @drarkayl Corrent, "...当执行发生时",但这是一个编译时错误,因为您的 System.exit(0); 调用没有 @ 987654323@ 之后,编译器假设 if 之后的赋值也会被执行。
  • @LuigiEdlCarno 正是我正在寻找的答案。谢谢。
【解决方案2】:

x 的值为 1 或 2,具体取决于 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;
    }

【讨论】:

  • 谢谢你的回答,我明白了你的意思,但如果你看到执行流程,我没有分配两次。它只分配一次。
  • 你说x=1 然后x=2 所以x 被分配了两次
  • @drarkayl System.exit 不被视为代码终止......它不是返回......所以根据编译器,System.exit() 之后的代码可能会执行
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    在 System.exit 后添加 return 即可编译。

    【讨论】:

      【解决方案5】:

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

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

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

      现在,正如我所提到的,流程分析会检查明确分配,并且它发生在您的案例中的 if 子句中,并且您再次尝试更改 x 的值和这是不允许的……

      【讨论】:

        猜你喜欢
        • 2015-12-23
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多