黑马程序员技术交流社区

标题: 关于Array类中newInstance()方法的运用,求解 [打印本页]

作者: 袁冬梅    时间: 2012-5-17 01:14
标题: 关于Array类中newInstance()方法的运用,求解
  1. main(String[] ars)
  2. {
  3.                 //Array类中的public static Object newInstance(Class<?> componentType,int... dimensions)的用法
  4.                 int[][] test= new int[][]{{4,5,6},{1,2,3}};
  5.                
  6.                 Object o = Array.newInstance(test.getClass(), 1,2,3);
  7.                 getDimensionsOfArray(o);//出错了!   //////////////
  8. }
  9. //遍历数组深度
  10.         private static void getDimensionsOfArray(Object o) {
  11.                 if(o.getClass().isArray())
  12.                 {
  13.                         System.out.println(":"+Array.getLength(o));      ///////////92行
  14.                         Object tpmp = Array.get(o, 0);
  15.                         getDimensionsOfArray(tpmp); ///////////////////98行
  16.                        
  17.                 }else{
  18.                         System.out.println("整个数组已经遍历完了:");
  19.                 }
  20.         }
复制代码
错误:
:1
:2
:3
Exception in thread "main" java.lang.NullPointerException
        at cn.itcast.day1.ReflectDemo.getDimensionsOfArray(ReflectDemo.java:92)
        at cn.itcast.day1.ReflectDemo.getDimensionsOfArray(ReflectDemo.java:98)
        at cn.itcast.day1.ReflectDemo.getDimensionsOfArray(ReflectDemo.java:98)
        at cn.itcast.day1.ReflectDemo.getDimensionsOfArray(ReflectDemo.java:98)
        at cn.itcast.day1.ReflectDemo.main(ReflectDemo.java:79)

可以帮我分析一下, java.lang.NullPointerException
这个错误是在哪里产生的,怎么会产生么?
作者: 云惟桉    时间: 2012-5-17 02:04
main(String[] ars)

{

                //Array类中的public static Object newInstance(Class<?> componentType,int... dimensions)的用法

                int[][] test= new int[2][3];  //这句稍微改动一下

                Object o = Array.newInstance(test.getClass(), 2,3); //我觉得楼主用的例子就是二维数组吧,这里定成2,3是不是更合适?但是我试了一下楼主的原句,也不会错误。

                o = new int[][]{{4,5,6},{1,2,3}};  //加上这一句就正确了

                getDimensionsOfArray(o);

}

代码如上:
楼主原来的代码中,先是初始化了数组test,然后利用test所属类的字节码重新newInstance生成一个新的实例对象。
然而这个实例对象是空数组,也就等价于:Object o = new int[2][3];
而这个新的实例对象是没有对元素初始化的,因此,当递归到最里层,因为没有初始化,元素为null
再判断if(o.getClass().isArray()) 的时候,就会使用一个空的指针,当最里层o为null,怎么可以调用getClass()呢,是吧?

但愿讲解够清楚,楼主能理解。
作者: 袁冬梅    时间: 2012-5-17 06:31
云惟桉 发表于 2012-5-17 02:04
main(String[] ars)

{

恩,谢谢,看懂了,果然是我自己太不仔细了,3Q
作者: 袁冬梅    时间: 2012-5-17 06:48
云惟桉 发表于 2012-5-17 02:04
main(String[] ars)

{

如果 componentType 表示一个数组类,则新数组的维数等于 dimensions.length 和 componentType 的维数的总和

上面那句话是API中的,我需要怎么理解呢?其实我自己想当然的弄成5维数组了。。。。。不过我看了很多遍觉得我这样的想法也没错啊。。。
不过你说的NullPointerException这个问题果然是我读API不够仔细啊。
作者: 云惟桉    时间: 2012-5-17 11:17
恩,其实我觉得你说维度是5也蛮对的,但是不理解它的可变参数有什么深意,如果用可变参数应该是有多个参数才对。还需要再琢磨琢磨…




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2