【问题标题】:Handling uninitialized Strings in Java在 Java 中处理未初始化的字符串
【发布时间】:2014-10-28 05:40:02
【问题描述】:

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

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:错误:变量名可能尚未初始化 if (name==null)

问题很容易解决,将第四行替换为:

String name = null;

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

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

【问题讨论】:

标签: java object compiler-errors initialization


【解决方案1】:

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

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

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

来自 Java 语言规范第 4 章中的 "Initial Values of Variables"

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

【讨论】:

  • 另请注意,如果您不小心,null 可能会导致某些字符串函数出现一些问题。因此,有时我会改用String foo = ""
【解决方案2】:

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

【讨论】:

  • 注意不能将对象初始化为null,但是可以将Object类型的引用初始化为null。
【解决方案3】:

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

考虑以下函数:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2014-02-08
    • 1970-01-01
    • 2013-10-04
    • 2023-03-16
    • 2021-12-17
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多