下面是一个示例方法:

boolean method(int value, boolean check1, boolean check2) {
    String code;
    boolean valueIncorrect = false;
    boolean otherIncorrect = false;

    if (value < 0 || value > 10) {
        code = "lengthCode";
        valueIncorrect = true;
    }
    if (check1) {
        code = "otherCode";
        otherIncorrect = true;
    } else if (check2) {
        code = "otherCode";
        otherIncorrect = true;
    }

    if(!valueIncorrect && !otherIncorrect) {
        return true;
    }
    
    if (otherIncorrect) {
        return code.contains("HELLO");
    }
    return true;
}

当我试图编译时,在我试图调用CONTAINS()方法的行处得到错误:variable code might not have been initialized. 如果我们看一下逻辑,在那个点上代码不可能为空,对吗?还是我说错了?只有当其中一个布尔值为真时,执行才会达到该点,并且无论它们中的任何一个被设置为真,代码的值也都被设置. 因此,我不期望编译器进行无限复杂的分析,但我也知道,如果它是一个简单得多的条件:

if(boolean) code = "x";
else code = "y";
return code.contains("whatever");

这样就不会抛出错误.我误解了什么?

推荐答案

您假设,既然您可以推断code将始终被初始化,那么Java编译器可以(并且应该)做出相同的推断,并将您的代码称为正确的.

事实上,编译器正在应用第16: Definite Assignment章中JLS规则中规定的明确赋值规则.这些规则不允许(例如)条件的值被考虑unless它们是(编译时)constant expressions...在JLS定义的技术意义上.

需要一个合规的编译器来逐字实现这些规则.对于一个聪明的Java编译器来说,(比方说)使用最新的机器推理技术并推断出code实际上总是在使用之前被初始化,那就是not acceptable.

为什么?因为这会导致可移植性问题;即,一个Java编译器称您的源代码是错误的,而另一个编译器则说它是正确的.


简而言之,这不是Java编译器错误.这是Java语言的一个特性.

Java相关问答推荐

Selenium Java:无法访问IFRAME内部的元素

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

了解Android Studio中的调试器输出

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

neo4j java驱动程序是否会在错误发生时自动回滚事务?

在for—each循环中的AnimationTimer中的if语句'

Character::Emoji不支持带数字的字符吗?

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

Spring Boot@Cachebale批注未按预期工作

JPanel透支重叠的JComcoBox

try 判断可选参数是否为空时出现空类型安全警告

如何在Spring Java中从数据库列中获取JSON中的具体数据

从映射列表中检索所有键

如何获得凌空cookies ,并设置它在下一个请求- android

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

从泛型枚举创建EnumMap

如何调整JButton的大小以适应图标?

Java Flux中的延迟增加

根据应用程序 Select 的语言检索数据

java 11上出现DateTimeParseException,但java 8上没有