我知道 Java 会强制您在使用每个局部变量之前对其进行初始化。但是,在某些情况下它会变得棘手。考虑一下:
public class TestClassOne {
public void methodOne() {
String s;
if(false)
System.err.println(s);
else
s = "Hi";
}
}
这个类将编译成功。然而,这个不会:
public class TestClassTwo {
public void methodTwo() {
String s;
if("hola".equals("chau"))
System.err.println(s);
else
s = "Hi";
}
}
为什么 Java 能够检测到 if block 永远不会在第一个类中进入,而在第二个类中却不能?
编辑:
感谢您的回答。
我正在寻找的是确保程序可以编译的 if 条件的正式特征。
如果 if 条件是一个编译时 boolean 常量,那么是否可以安全地得出此代码将编译的结论?起初我会想“不,在大多数情况下你会得到'无法访问的代码'错误”(除了 Jesper 指出的字面错误情况),但我已经尝试了以下给定的结果:
if(false) ... //compiles
if(0 == 1) ... //compiles
final boolean b = false;
if(b) ... //compiles
最佳答案
if (false)
是支持条件编译的特例。
参见 Example 13.4.9-2在 Java 语言规范和 Paragraph 14.21关于不可达语句的详细解释。
Java 知道 if (false)
block 的内容永远不会执行,所以它不会提示使用了未初始化的变量,但它不会提示“无法访问的代码” "由于特殊的条件编译情况导致的错误。
对于像 equals()
这样的方法调用,编译器不会分析代码以查看在这种情况下它总是返回 false
。
关于java - Java 在检测未初始化的局部变量时有多聪明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30060530/