在Java中,我理解无论何时打印对象引用,都会调用内部toString()。默认情况下,toString()将以此格式打印“classname @ hashcode”。如果这是真的,那么下面的代码片段应该引发空指针异常。为什么不会发生?
int[][] a = new int[3][];
System.out.println(a); --> Prints [a@xxxxx
System.out.println(a[0]); --> Prints null (It should have thrown Null pointer Exception?)
有人可以帮助我理解这个吗?
答案 0 :(得分:4)
这是因为println()
未调用toString()
。相反,它会调用String.valueOf(x)
,检查x
是null
是否NullPointerException
以阻止PrintStream
。
查看这些文档页面(或者只查看https://sandbox.bluesnap.com/services/2/subscriptions/:subscription-id
的源代码):
答案 1 :(得分:1)
因为在定义为[x] [y]的2D数组中,x索引保存y的引用,y是y元素的数组。
所以当你打印System.out.println(a);
时,它给出了toString表示。
当你查询为System.out.println(a [0]);它有一个空引用,因此它打印为null
答案 2 :(得分:0)
println检查null并改为打印null,而不调用toString。它类似于:println(Object x){out.append((x!= null)?x.toString():“null”); out.append( “\ n”); }
答案 3 :(得分:0)
a
不为空,你声明你从未声明或设置int[][] a = new int[3][];
的第一行a[0]
中的是什么,但它是null。您可以打印此值并传递此值,而不会导致空指针异常。当您尝试在空值上调用方法时,会出现空指针异常。因此,如果您在该空值上调用a[0].toString()
或任何其他方法,则会得到空指针异常。
https://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html