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

时间:2021-06-09 12:01:41

标签: java 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

任何解释将不胜感激。

3 个答案:

答案 0 :(得分:5)

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

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

所以 a[1] 是空值,并且没有该空值的 [0]。

答案 1 :(得分:4)

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

看下面的代码

 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

答案 2 :(得分:2)

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

在 case2 中,您将空值分配给字符串数组并尝试使用索引获取空对象。因此你得到了 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]);
    }
}

\Code 打印不带引号的 'null'