一道关于Java数组的考题

作者在 2008-04-16 14:06:11 发布以下内容

class A13 {

}

public class A {

public static void main(String[] arg) {

A13[] a1 = new A13[1]; // 1

A13[][] a2 = new A13[2][1]; // 2

A13[][][] a3 = new A13[3][3][3]; // 3

System.out.print(a3[2][2][2]); // 4

a1[0] = new A13(); // 5

a2[0] = a2[1] = a1; // 6

a3[0] = a3[1] = a3[2] = a2; // 7

System.out.print(a3[2][2][2]); // 8

}

}
        以前考的。程序如上,问答案是什么?结果是能够编译,但运行时会出现数组越界的异常。这个异常发生在有注释8的那一行,就是System.out.print(a3[2][2][2]);这一行。
        这个程序大体可以分为两段。第一段,前4行,就是定义三个数组,然后第4行打印出a3[2][2][2]。很明显,我们只是定义了数组,给了它一个长度,但是里面并没有放东西进去,所以运行到这里,打印出来是null。后半部分从第5行开始,分别给数组里面添加元素,然后再输出a3[2][2][2]。这个时候,将会出现数组越界的异常。
        为什么上半部分没有报异常,后半部分就出现异常了呢?这道题考的其实是你对Java数组的理解。a3数组是一个三维的,但是,我们应该这么来理解:即,先将a3看成一个一维数组,这样就有a3[0], a3[1], a3[2]。然后每一个子元素中放有一个二维数组a2。注意,a2虽然是一个二维数组,其实也可以这样来看,即a2拥有a2[0], a2[1],然后每一个元素中含有一个a1数组。所以,真正的结构是这样的:

数组a1: a1[0]

数组a2: a2[0][0]

            a2[1][0]

数组a3: a3[0]:a2[0][0],a2[1][0]

            a3[1]:a2[0][0],a2[1][0]

            a3[2]:a2[0][0],a2[1][0]

        这样应该能看出来了吧,a3[2][2][2]的确是会出现异常的。这道题的确很迷惑人,需要注意。

Java | 阅读 3241 次
文章评论,共0条
游客请输入验证码