为什么第一行抛出NullPointerException但第二行没有?

时间:2015-04-04 19:57:08

标签: java arrays nullpointerexception tostring

以下代码中的toString方法抛出NullPointerException,但printl打印后调用null。为什么他们没有相同的结果? THL

package exceptionsNullPointer;

public class NPArrays {

    public static void main(String[] args) {
        String[] laces = new String[2];

        // this line throws NullPointerException
        System.out.println(laces[1].toString());

        // this line prints null
        System.out.println(laces[1]);
    }
}

3 个答案:

答案 0 :(得分:6)

因为laces[1]是对String数组的(尚未初始化的)成员的完全有效的引用。

当创建非基本类型的数组时,其所有成员都默认为null,直到它们被赋予实际值。因此,引用laces[1]只会返回null,这很好。

但是你的第一行尝试在空引用上调用toString方法。因为空引用不指向实际的String实例,所以Java唯一能做的就是抛出NullPointerException。您无法在null引用(或指针)上调用方法。

答案 1 :(得分:3)

laces[1]为null,因为您尚未为其指定非空引用。这意味着,在第一种情况下,您无法取消引用它以致电toString(),或者您将获得NullPointerException

然而,在第二种情况下:引用PrintStream.print(String)的javadoc:

  

如果参数为null,则打印字符串"null"

答案 2 :(得分:1)

如前所述,鞋带[1]为null,因此您无法调用任何方法。 您可以使用Objects.toString获取一个空安全字符串表示形式,例如System.out.println(Objects.toString(laces[1]));