当最后一个局部变量与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 楼答案
从评论中,您似乎在寻找为什么第一个代码会给您一个
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