在检测未初始化的局部变量时,Java有多聪明?

Lea*_*van 1 java initialization

我知道Java会强制您在使用它之前初始化每个局部变量.但在某些情况下,它会变得棘手.考虑一下:

public class TestClassOne {

    public void methodOne() {
        String s;

        if(false)
            System.err.println(s);
        else
            s = "Hi";
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类将成功编译.但是,这个不会:

public class TestClassTwo {

    public void methodTwo() {
        String s;

        if("hola".equals("chau"))
            System.err.println(s);
        else
            s = "Hi";
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么Java能够检测到if-block永远不会输入到第一个类而不是第二个类中?

编辑:

谢谢你的回答.

我正在寻找的是if-condition的正式表征,确保程序可以编译.

如果if条件是编译时布尔常量,那么可以安全地断定这个代码是否会编译?起初我会想"不,在大多数情况下你会得到'无法访问的代码'错误"(除了Jesper指出的文字错误案例),但我已经尝试了以下给定的结果:

if(false) ... //compiles

if(0 == 1) ... //compiles 

final boolean b = false;
if(b) ... //compiles
Run Code Online (Sandbox Code Playgroud)

Jes*_*per 5

if (false)是支持条件编译的特例.

有关详细说明,请参阅Java语言规范和第14.21 中的示例13.4.9-2有关无法到达的语句.

Java知道if (false)块的内容永远不会被执行,所以它不会抱怨使用的未初始化变量,但是由于特殊的条件编译情况,它不会抱怨"无法访问的代码"错误.

对于类似的方法调用equals(),编译器不会分析代码,以便false在这种情况下始终返回.