其实你可以这么理解:
对于int[][]来说,由于二维数组是int型,arr[0]代表第一行,由于没有值,所以是null;
对于char[][]来说,由于二维数组是char型,arr[0]代表的是某一行字符的指针,即相当于一个字符串的指针,但是因为也没有赋值,所以是nullpointer,即空指针,java中对于空指针,会提示一个意外,即exception。
其实,这两种情况是差不多的。只是结果不一样。
System.out是一个PrintStream的实例。打开Java源代码查java.io.PrintStream
其中定义了
public void println(char[] chars) {
println(new String(chars, 0, chars.length));
}
抛出NullPointerException
但是没有定义参数为int[],所以System.out.println(arr[0]);会调用
public void println(Object o) {
println(String.valueOf(o));
}
不会抛出NullPointerException
你发现了一个编写java源码的人的一个bug(实际arr[0]对象也为空指针)
查看源码,证明这是一个bug:
直接在ecliplse 中右键点击……ut.println(arr[0]);//…… ,选择“open declaration”
然后你可以查看源码中的类方法调用关系:
调用的是print(Object obj)
调用的是print(char a[])
在然后你得到实际输出内容的就是String.valueOf(arr[0])
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
我们可以看到即使你传递过来是一个空指针,实际输出的只是小写的null
该bug描述:在PrintStream
实例中,缺少print(int a[])的方法,只有print(char a[]) 和print(object a[])
没什么理由,java语言在设计时就是这么干的。
其实有些问题就没有必要追根溯源的问个为什么。
我干java开发几年了,也不清楚这是为什么,就算知道这是为什么了,对开发也没有什么用。出了异常就修正呗。
举个例子:java里面几乎100%的方法名的定义都是第一个单词首字母小写,其余的首字母大写,但偏偏就是有一个方法的第二个单词的首字母不是大写的。我们不禁想问,这个方法怎么不符合规则,这是为什么呢?没人知道为什么,可能就是当时写这个方法的人的失误导致的。
附上这个方法:
String.substring(int beginIndex)
你能有这种探究精神是很好的,这个写法会报错你知道就好了
这个是int类型会给你默认一个0值当它为空的时候,而char类型就没有了 所以你输出就是null了