示例代码:
编译错误:
最后一个局部变量标志可能已经被赋值了
final boolean flag;
while (flag = false) { // I am using = instead of == just to test it
System.out.println("inside loop");
}
编译错误:
访问代码
final boolean flag = false;
while (flag) {
System.out.println("inside loop");
}
我知道:
- 本地变量必须在第一次使用之前初始化。根据编码标准,最终的局部变量必须在声明时初始化。
问题:
- 这两种说法有什么不同?根据我的理解,两者是一样的。
- 为什么第一个示例代码不讨论不可达代码。第二个编译错误对我来说是清楚的。
如果在if
条件下工作良好
final boolean flag;
if (flag = false) { // no compilation error
System.out.println("inside if block");
}
如果我在while
循环中添加break
语句,确保编译器final
局部变量在其生命周期中只能初始化一个,则可以正常工作。
final boolean flag;
while (flag = false) {
System.out.println("inside if block");
break;
}
案例1:每次在'while'循环中迭代时都会分配'flag'。您正在使用赋值运算符"="而不是"=="。
案例2:'flag'总是为false,因此'if'中的代码将永远不会执行。
这两句话的区别是什么?按照我的说法理解两者是一样的
你们的代码怎么可能是一样的??在第一种情况下,您用false初始化flag
变量,因此它将假设在每次循环迭代时初始化flag
变量(由编译器在编译时做出决定,因为它不知道no。但实际上这段代码永远不会被执行——因此将其视为非最终变量,因此,矛盾,而在第二种情况下,它也不会运行,因为标志已经在声明步骤中被声明为false, NOT INSIDE the BODY of LOOP!!所以,第二个将是一个无限循环!
final boolean flag;
while (flag = false) { // First code---flag final variable initialised with each iteration
System.out.println("inside loop");
}
final boolean flag = false;
while (flag) { // Second code
System.out.println("inside loop");
}
为什么第一个示例代码不讨论不可达代码。第二个编译错误对我来说是清楚的。
因为首先报告编译错误中的一个。在本例中,第一个显示与flag
变量声明不正确有关的错误。摘自维基百科:
final变量只能初始化一次,要么通过初始化式或赋值语句。它不需要如此在声明点初始化:这被称为"空白"最终"变量。类的空最终实例变量必须为在它所在的类的每个构造函数中明确赋值声明;类似地,空白final静态变量必须是绝对的在声明它的类的静态初始化器中赋值;
从评论中,似乎您正在寻找为什么第一个代码确实给了您The final local variable flag may already have been assigned
而不是Unreachable error
。
这是因为java编译有不同的阶段,详见:http://openjdk.java.net/groups/compiler/doc/compilation-overview/
表达式在第一阶段(Attr)求值。只有在第一阶段没有错误的情况下才进行流分析。由于非法赋值在第一阶段被捕获,第二阶段(Flow)将不会被执行,并且您将不会获得Unreachable Error