为什么Java中的单元化对象没有设置为null?

Auf*_*gel 4 java null initialization

我在这里遇到一个非常基本的问题,即使它必须存在,我也无法找到解决方案.

我有以下代码:

public class Foo {
    public static void main(String[] args) {
        String foo;
        if (foo != null) {
            System.out.println("foo");
        } else {
            System.out.println("foo2");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了我

''变量可能尚未初始化''

.为什么我必须明确地指定null,并且默认情况下并非所有变量都用null初始化?

Jon*_*eet 15

它可以防止您在明确分配之前意外使用局部变量.这是一个东西-它有助于防止错误.遗憾的是它不能用于字段(实例和静态变量) - 但除了最终变量之外,编译器不知道你什么时候读取它们与你要分配它们的时候 - 它无法告诉您要调用方法的顺序.在单个方法中,它有更多关于流量控制的信息,因此可以为您提供更多检查.

如果您希望局部变量的值为null,为什么不它显式设置为null?这不仅让编译器感到高兴 - 它也清楚地说明了你的意图.

有关明确赋值的更多详细信息,请参见Java语言规范的第16章.

这是一个如何防止错误的例子:

Iterable<String> collectionOfNames = ...; // Some method call
String lastNameInCollection;
for (String name : collectionOfNames)
{
    lastNameInCollection = name;
}
System.out.println("The last name was: " + lastNameInCollection);
Run Code Online (Sandbox Code Playgroud)

如果收集是空的,会发生什么?也许我们想打印"姓氏是:null" - 但也许我们应该做点其他事情.以上不能编译(lastNameIncollection可能没有分配)的事实迫使程序员考虑名称集合为空的情况.

  • @Reboot:不,我已经解释了原因:这是为了避免你在获得价值之前意外使用它们. (2认同)
  • @Reboot:我现在已经多次回答:防止错误.如果你有代码通过两条路线之一来分配一个值,但实际上有第三条路线*不会*分配一个值,为什么我不想在编译时知道呢?该语言的设计旨在避免您犯这种错误.我不知道我怎么能比那更清楚...... (2认同)