String [][]a = new String[][]{{"a","b"},{"c","b","d","e"},{"q","w"}};
String [][]b = new String[3][5];
b[2][3] = "abcdefg";
System.arraycopy(a,0,b,0,a.length);
System.out.println(b[2][3]);这行为什么还是越界了
打b整个个遍历一次,为什么它的范围蛮成了a的范围,变小了,在次访问b所在的空间,就越界了.... String []a = new String[]{"a","b","c","d","e"};
String []b = new String[7];
System.arraycopy(a,0,b,0,a.length); 这个的b[6]为什么能打印出为是null
这个上面的二维为什么我觉得可以打印的值,为什么就越界了.....那位高手帮帮忙呀....初学者对这里有点不明白...

解决方案 »

  1.   

    第一个错误:
    System.out.println(b[2][3]);数组越界原因,b[2][3]检查的是{"q","w"}从0开始但这只有两个元素。所以越界。
    第二个错误:
    你要输出的是b[7].可数组只有5个元素。所以输数null
      

  2.   

    那为什么b[2][3]输出的不是null.先前定义的b不是三行,每行5个元素的,而且在输出之前还给b[2][3]赋值了的....就也应该有结果输出,不会出现越界的呀,为什么在这就越界了.....
      

  3.   

    数组拷贝改成:for(int i=0;i<a.length;i++){
           System.arraycopy(a[i], 0, b[i], 0, a[i].length);
    }
      

  4.   

    String [][]a = new String[][]{{"a","b"},{"c","b","d","e"},{"q","w"}};是在一维数组中存储一个一维数组的引用(a[0]中存储一个数组的引用指向{"a","b"}这个字符串数组), java中的数组是引用内型,ArrayCopy()函数对于二维数组的复制是把第二维的引用复制到目标数中,所以上面的b[2][]是原来的那个引用指向{"q","w"},所以访问的时候会出现越界,表达得不是很清楚,大家看看这种说法对不对 
      

  5.   


            System.arraycopy(a,0,b,0,a.length);
            //从数组a的a[0]开始复制a.length=3个数据(a[0],a[1],a[2])到数组b,从数组b[0]位置的三个数据
            //即b[0]=a[0],b[1]=a[1],b[2]=a[2],
            //b[2].length=2,b[2][3]越界
      

  6.   

    解答:第二个问题是很简单的,arraycopy(a,0,b,0,a.length)这句执行之后b数组中的前五个是a数组对应的值,而第六个和第七个没有赋值所以b【6】(第七个值)为null
    第一个问题是当执行完arraycopy(a,0,b,0,a.length);之后二维数组b已经不再是你定义的二维数组了,它受到二维数组a 的影响,b[i].length的值已经不再是5了,它得根据二维数组a中对应的a【i】.length的值一样,所以b[2].length的值为2,而不是3,当你要打印出b[2][3]编译器当然报告出界了。你可以运行一下以下代码你就完全明白了
      String [][]a = new String[][]{{"a","b"},{"c","b","d","e"},{"q","w"}}; 
    String [][]b = new String[4][5]; 
    b[2][3] = "abcdefg"; 
    System.arraycopy(a,0,b,0,a.length); 
    System.out.println(b.length);
    System.out.println(b[2].length);
    System.out.println(b[1].length);
    System.out.println(b[0].length);
    System.out.println(b[3].length);
    至于b[i].length为什么会变化我想道理是六楼的解释了
      

  7.   

    大家的回帖基本上已经说清楚了:Java其实没有多维数组,只有一维数组。多维数组可以解释为"数组的数组"。LZ的两个数组a[][],b[][]本质上就是一维数组,只不过每一个数组元素是指向另外一个数组的引用。a ----->  a[0] ------>  {"a","b"}  //a[0]是一个长度为2的数组
              a[1] ------>  {"c","b","d","e"}   //a[1]是长度为4的数组
              a[2] ------>  {"q","w"]  //a[2]的长度也是2b ----->  b[0] ------> 一个长度为5的数组
              b[1] ------> 一个长度为5的数组
              b[2] ------> 一个长度为5的数组System.arraycopy(a,0,b,0,a.length); 语句使得b[0]=a[0],b[1]=a[1],b[2]=a[2]
    由于数组也是对象,b[0],b[1],b[2]都是指向数组对象的引用。而上面的数组拷贝操作已经改变了b[0]等引用所指向的内存区域,使得:
    b ----->  b[0] ------> {"a","b"} 
              b[1] ------> {"c","b","d","e"} 
              b[2] ------> {"q","w"]
    这样b[2][3]当然就越界了