为什么这段代码没有抛出 nullPointerException?

Why is this code not throwing a nullPointerException?

代码片段如下。

我知道字符串的默认值是 null 并且它分配给了 str。我不明白的是为什么 null 在第一种情况下打印但在其他情况下不打印(如第二个代码片段)。

public class Case1{

    static String str;

    public static void main(String[] args){

        System.out.println(str);
    }
}

\Code prints 'null' without quotes
public class Case2{

    public static void main(String[] args){

        String a[][] = { {}, null };
        System.out.println(a[1][0]);
    }
}

\Code throws nullPointerException

任何解释将不胜感激。

在你的第二个例子中,你正在做的是访问一个不存在的数组的第一个值:

String a[][] = { {}, null };

所以a[1]是null值,那个null没有[0]。

在您的示例中,您试图访问空值。

看下面代码

 String a[][] = { {}, null };
 System.out.println(a[1]);

它将打印

null

并且当您尝试访问 null 上的第 0 个元素时,它会抛出空指针预期,因为您试图访问 null

上的元素
String a[][] = { {}, null };
System.out.println(a[1][0]);

它会输出

Exception in thread "main" java.lang.NullPointerException

在案例 1 中,您只是打印字符串,并没有为那里分配任何值,因此默认情况下打印 null。您不对该字符串执行任何操作以在那里抛出 NullPointerException。因此它不会抛出任何异常。

在情况 2 中,您将空值分配给字符串数组并尝试使用索引获取空对象。因此你得到了 nullPointerException。

如果您使用以下代码更改 case2,您也会在那里得到 null。

public class Case2{

public static void main(String[] args){

    String a[][] = new String[2][2];
    a[1][0] = null;
    System.out.println(a[1][0]);
    }
}

\代码打印 'null' 不带引号