以下代码中的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]);
}
}
答案 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]));