有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当最后一个局部变量与while循环一起使用时,java会出现不同的编译错误

示例代码:

编译错误:

The final local variable flag may already have been assigned

final boolean flag;
while (flag = false) { // I am using = instead of == just to test it
    System.out.println("inside loop");
}

编译错误:

Unreachable code

final boolean flag = false;
while (flag) {
    System.out.println("inside loop");
}

我知道:

  • 局部变量必须在首次使用前初始化
  • 根据编码标准,最终的局部变量必须在声明时初始化

问题:

  • 这些说法之间有什么区别?据我所知,两者都是一样的
  • 为什么第一个示例代码没有提到无法访问的代码。我很清楚第二个编译错误

If在if条件下工作正常

final boolean flag;
if (flag = false) { // no compilation error
    System.out.println("inside if block");
}

如果我在while循环中添加一个break语句,确保编译器在final局部变量的生命周期中只初始化一个,If就可以正常工作

final boolean flag;
while (flag = false) {
    System.out.println("inside if block");
    break;
}

共 (1) 个答案

  1. # 1 楼答案

    从评论中,您似乎在寻找为什么第一个代码会给您一个The final local variable flag may already have been assigned而不是Unreachable error

    这是因为java编译有不同的阶段,如下所述:http://openjdk.java.net/groups/compiler/doc/compilation-overview/

    表达式在第一阶段(Attr)进行计算。只有在第一阶段没有错误时,才进行流量分析。由于非法分配在第一阶段被捕获,第二阶段()将不会执行,并且您将不会得到Unreachable Error