6

这是我作为家庭作业做的一个小程序的一部分:

public Exam maxGrade() {
    Node p = firstNode;
    int max = 0;
    String name;
    while (p!=null) {
        if (p.info.getGrade()>max) {
            max = p.info.getGrade();
            name = p.info.getName();
        }
        p = p.next;
    }

    if (name==null)
        return null;
    else
        return searchByName(name);
}

因此,当我继续编译时,编译器会输出以下消息:

Student.java:127:错误:如果 (name==null),变量名可能尚未初始化

通过将第四行替换为:

String name = null;

现在,我可以看到其中的一些逻辑。但我真的很想掌握问题背后的工作原理。我的意思是,如果编译器看到你在代码中对它做某事,编译器检查变量是否被初始化似乎是合理的,但我认为我没有做任何需要初始化变量的事情。

根据这样的来源,我简单地声明我的字符串(或任何其他对象)变量“名称”时,它已经指向 null。那么为什么简单地检查该值是否为空会被视为异常呢?除了赋值之外,编译器会考虑我对未初始化变量所做的任何事情吗?

4

3 回答 3

14

对象类型的字段默认初始化为空。默认情况下,数组成员也初始化为 null。

局部变量不是 - 它们必须显式初始化。

这是一件好事。未初始化的变量通常表示错误。

来自Java 语言规范第 4 章的“变量的初始值” :

局部变量(第 14.4 节、第 14.14 节)必须在使用前通过初始化(第 14.4 节)或赋值(第 15.26 节)显式赋予一个值,其方式可以使用明确赋值规则(第16)。

于 2013-05-18T20:37:40.117 回答
1

null如果您对其值做出任何假设,编译器会要求您将 Object 初始化为。这只是一个(非常有用的)预防措施。

于 2013-05-18T20:37:59.550 回答
0

附录:编译器无法检查程序的语义。即使您知道变量在第一次使用之前已初始化,编译器也不能。

考虑以下函数:

public boolean mod2(int i){
    if(i % 2 == 0){
        return true;
    }
    if(i % 2 != 0){
        return false;
    }
}

我们都知道这个方法总是会返回 true 或 false。相反,编译器不能确保总是有返回值,因为他必须知道只有这两个结果。所以编译器会报一个缺少return语句的错误。

于 2014-10-27T21:40:02.853 回答