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

标签 java initialization

我知道 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/

相关文章:

java - 在 Android Studio 中解析 JSON 对象

javascript - 为什么从 JavaFX 插入 DOM 时 JavaScript 方法不执行?

java - Spring JPA 数据 : Custom Generic Repositories and Services: UnsatisfiedDependencyException

c - 用零初始化双类型数组时出现问题

java - 在 Eclipse IDE 中使用 maven/m2e 从 .proto 自动生成 Java

java - 我需要帮助按照我的老师想要的方式制作 prims 算法

c++ - 使用空标记结构,编译器声称我缺少初始化器,但我不是

c - 将 char 数组设置为全零值(在 C 中)

c++ - 正在使用未初始化的变量 C++

C# 对象初始化选项