java int和char二维数组的问题

int[][] arr=new int[3][];
System.out.println(arr[0]);// 1

char[][] array=new char[3][];
System.out.println(array[0]);// 2

在1打印的是null我知道,因为arr[0]的默认值是null
但在2打印为啥就是NullPointerException?为什么不是null?

第1个回答  2013-09-30
其实你可以这么理解:
对于int[][]来说,由于二维数组是int型,arr[0]代表第一行,由于没有值,所以是null;
对于char[][]来说,由于二维数组是char型,arr[0]代表的是某一行字符的指针,即相当于一个字符串的指针,但是因为也没有赋值,所以是nullpointer,即空指针,java中对于空指针,会提示一个意外,即exception。

其实,这两种情况是差不多的。只是结果不一样。
第2个回答  2013-09-30
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本回答被提问者采纳
第3个回答  2013-09-30

你发现了一个编写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[])

第4个回答  2013-09-30
没什么理由,java语言在设计时就是这么干的。
其实有些问题就没有必要追根溯源的问个为什么。

我干java开发几年了,也不清楚这是为什么,就算知道这是为什么了,对开发也没有什么用。出了异常就修正呗。

举个例子:java里面几乎100%的方法名的定义都是第一个单词首字母小写,其余的首字母大写,但偏偏就是有一个方法的第二个单词的首字母不是大写的。我们不禁想问,这个方法怎么不符合规则,这是为什么呢?没人知道为什么,可能就是当时写这个方法的人的失误导致的。
附上这个方法:

String.substring(int beginIndex)

你能有这种探究精神是很好的,这个写法会报错你知道就好了
第5个回答  2013-09-30
这个是int类型会给你默认一个0值当它为空的时候,而char类型就没有了 所以你输出就是null了