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了

java 数组 int和char的区别
int[][] int1=new int[3][2];int1[i]引用第i个字数组,也就是二维表中的第i行。它本身也是一个数组,int1[i][i]引用这个数组的第j项。对于 int[][] int1=new int[3][];new语句执行后,int1被在栈中分配了空间,引用一个三维数组;三维 数组也被分配了空间(在堆中),三位数组...

java高手:java定义二维数组问题
int a[][] = new int[3][2]; 表示定义一个三行二列的二维数组,但是a[0] = {1,6}; 是对一维数组进行赋值,而a是二维数组无法使用一维数组的赋值方法,所以程序会报错。该代码的正确方法应该是:int a[][] = new int[3][2];a[0][0]=1;a[0][1]=6;...

java关于二维数组的问题。
首先这个二维数组可以看成是一个标准的 3X3 的矩阵 第一个循环 :for(int i = 0;i<arr.length;i++){ for(int j=0;j<arr.length;j++){ System.out.print(arr[i][j]);} System.out.println();} 第一轮大循环:i 取值为0时,j取值0,1,2,则打印:arr[0][0],arr[0][1],a...

关于java中二维数组输出的问题
int[][] arr={new int [1] {1},new int [2] {2,3},new int [3] {4,5,6}};则二维数组arr.length等于3,表示它由3个一维数组组成,即3行。arr[0].length表示第1个一维数组的长度1,即1列。arr[1].length表示第2个一维数组的长度2,即2列。arr[2].length表示第3个一维数组的长...

怎样用java输入一个char型的二维数组
以下是文字版的代码:import java.util.Scanner;public class Test{ public static void main(String []args) { Scanner in=new Scanner(System.in);System.out.print("请输入数组c第一维的元素个数:");int n=in.nextInt();char[][] c=new char[n][];int[] m=new int[n];int i,k;...

java的二维数组问题
以下是定义的加法函数(使用try捕获异常这么简单)public static int[][] add(int[][]a,int[][]b){try{int sum = 0;int[][]c=new int[a.length][a.length ];for(int i=0;i<c.length;i++) { for(int j=0;j<c.length;j++) { c[i][j]=a[i][j]+b[i][j];...

java 二维数组问题
int arr[][] = new int[][] { { 4, 5 }, { 6, 7 } };System.out.println("二维数组中的各个元素是");for (int x[] : arr) { for (int i=0;i<x.length;i++) {\/\/这里for (int i : x) 改成for (int i=0;i<x.length;i++)if (i == x.length-1) { \/\/...

Java二维数组问题
你的这段写法里面有下面的问题:1、数组的定义:Object [][] arr = new Object[4][];数组长度必须明确,方可使用,如:Object[][] arr = new Object[4][4];。2、赋值:arr[0][0] = new String[0]["字符串张三"];数组的方括号中的是数组下标,不是值,如:arr[0][0] = new ...

java中二维数组的初始化问题
int[][] a=new int[2][3];后面那两个中括号必须都有值,如果是变量,这个变量必须已经赋值。

java关于二维数组分配空间
如果写成这样:int s [][]={{1,2},{3,4,5},{6,7,8,9}};那它就是一个3行X列的数组,X表示2、3、4,也就是说第1行有两个元素,第2行3个,第3行4个,不是规则的3行4列的了。关于这两种方式输出结果,你第一种分析的正确。第二种形式,根据我上面说的,下面这四个输出你应该...

相似回答
大家正在搜