2015-04-04 56 views
2

以下代码中的toString方法将引发NullPointerException,但打印后的println调用将打印为null。为什么他们没有相同的结果? THL为什么第一行抛出NullPointerException但第二行不?

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]); 
    } 
} 
+2

您的最后一行永远不会到达。 – 2015-04-04 20:03:58

+1

@MartinAndersson这是真的,但让我们假设海报是指其中一个或另一个被注释掉的情况。 – Bobulous 2015-04-04 20:06:10

+0

..或最后一行放在中间=) – 2015-04-04 20:06:42

回答

6

因为laces[1]是一个String阵列的(尚未初始化)构件完全有效的参考。

创建非基元类型的数组时,其所有成员默认为null,直到它们被赋予一个实际值。所以参考laces[1]将简单地返回null这很好。

但您的第一行尝试在空引用上调用toString方法。由于空引用并不指向实际的String实例,因此Java可以执行的唯一操作是抛出NullPointerException。您不能调用null引用(或指针)上的方法。

2

laces[1]为空,因为您还没有为其分配非空引用。这意味着在第一种情况下,您无法取消引用它,请致电toString(),否则您将获得NullPointerException

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

如果参数是null那么字符串"null"被打印。

1

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

相关问题