黑马程序员技术交流社区

标题: 数组下标越界问题 [打印本页]

作者: 杨洋    时间: 2012-8-3 18:02
标题: 数组下标越界问题
class ArrayTest
{
public static void main(String[] args)
{
  int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
  for (int x=0;x<arr[x].length ;x++ )
  {
   for (int y=0;y<arr[x].length ;y++ )
   {
    System.out.print(arr[x][y]);
   }
   System.out.println();
  }
}
}
想了半天没明白怎么就越界了?
显示结果:
123
456
789
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at r.main(r.java:6)

作者: pphdsny3    时间: 2012-8-3 18:10
这样就行了,先是数组的长度arr.length,再是里面的一维数组arr[x].length
  1. class ArrayTest {
  2.         public static void main(String[] args) {
  3.                 int[][] arr = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
  4.                 for (int x = 0; x < arr.length; x++) {
  5.                         for (int y = 0; y < arr[x].length; y++) {
  6.                                 System.out.print(arr[x][y]);
  7.                         }
  8.                         System.out.println();
  9.                 }
  10.         }
  11. }
复制代码

作者: 周坤    时间: 2012-8-3 18:11
  1. class ArrayTest
  2. {
  3. public static void main(String[] args)
  4. {
  5.    int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
  6.    for (int x=0;x<arr[x].length ;x++ )//[color=Red]把arr[x].length改成arr.length。否则,在循环到最后一次,x自加到4,会先判断,这时就会有4<arr[4].length的出现,数组取不到4,数组越界。
  7. [/color]   {
  8.     for (int y=0;y<arr[x].length ;y++ )
  9.     {
  10.      System.out.print(arr[x][y]);
  11.     }
  12.     System.out.println();
  13.    }
  14. }
  15. }
复制代码

作者: 王程    时间: 2012-8-3 18:20
  1. class ArrayTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
  6. for (int x=0;x<arr[x].length ;x++ )//错误出在这里
  7. {
  8. for (int y=0;y<arr[x].length ;y++ )
  9. {
  10. System.out.print(arr[x][y]);
  11. }
  12. System.out.println();
  13. }
  14. }
  15. }
  16. 当x=2完了以后,会执行x++,然后还要判断x<arr[x].length,此时一维数组只有3个元素,但是arr[x]要取的是第四个,所以数组角标越界了
复制代码

作者: 杨洋    时间: 2012-8-3 18:25
周坤 发表于 2012-8-3 18:11

如果把数组变为int[][] arr=new int[][]{{1,2,3,},{4,5,6},{7,8,9,10}}
这个问题该如何解决
作者: 周坤    时间: 2012-8-3 18:33
杨洋 发表于 2012-8-3 18:25
如果把数组变为int[][] arr=new int[][]{{1,2,3,},{4,5,6},{7,8,9,10}}
这个问题该如何解决 ...

应该没有影响,照样可以输出,不用改,内存循环可以取到值。不会越界的。
作者: 杨洋    时间: 2012-8-3 18:39
周坤 发表于 2012-8-3 18:33
应该没有影响,照样可以输出,不用改,内存循环可以取到值。不会越界的。 ...

不行啊,是输出了,还多一行
123
456
78912
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at r.main(r.java:6)
作者: 周坤    时间: 2012-8-3 18:55
杨洋 发表于 2012-8-3 18:39
不行啊,是输出了,还多一行
123
456

怎么可能,把错误的代码改过来了吗?
把arr[x].length改成arr.length。
作者: 杨洋    时间: 2012-8-3 19:10
周坤 发表于 2012-8-3 18:55
怎么可能,把错误的代码改过来了吗?
把arr[x].length改成arr.length。

class ArrayTest
{
public static void main(String[] args)
{
  int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9,12}};
  for (int x=0;x<arr.length ;x++ )
   {
    for (int y=0;y<arr.length ;y++ )
    {
     System.out.print(arr[x][y]);
    }
    System.out.println();
   }
}
}

结果是:
123
456
789   //二维数组的长度是3,12没有打印

作者: 张云杰    时间: 2012-8-3 19:15
不能用arr[x] 啊 , 你算一下嘛,  数组下标是从0开始, 比如 for只循环到10   x=10   然后你数10次 0-9 刚好10次, 那你数到10的时候 你觉得数组里还有值么?

当然是越界了 你超过了次数了 当然没有了...


作者: 周坤    时间: 2012-8-3 19:20
杨洋 发表于 2012-8-3 19:10
class ArrayTest
{
public static void main(String[] args)

class ArrayTest
{
public static void main(String[] args)
{
   int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9,12}};
   for (int x=0;x<arr.length ;x++ )//这里为x<arr.length,控制对大集合中小集合的遍历
    {
     for (int y=0;y<arr[x].length ;y++ )//这里改回去,y<arr[x].length 内存循环控制小集合中元素的遍历。
     {
      System.out.print(arr[x][y]);
     }
     System.out.println();
    }
}
}

作者: 张云杰    时间: 2012-8-3 19:25
再简单点的说,  程序中的arr[].length 的值为=3;
循环3次  x=0 , arr[0]      x=1 , arr[1]  x=2 , arr[2]  刚好3次,  

arr[3]   这里是第4次了.. 第4次 数组里已经没有值了 所以就越界了
作者: 官文昌    时间: 2012-8-3 19:38
一维数组取长度是数组名.length;二位数组可以看成是一维数组里面还有一维数组,你仔细看你的代码for (int x=0;x<arr[x].length ;x++ );这个代码;首先从书写来说就是错误的,为什么编译器没报错,是因为它没有语法错误,因改为:for (int x=0;x<arr.length ;x++ );他之所以会报角标越界,当你外循环运行x=2时,运行内循环,运行完后,x+1,x=3.这时候3<arr[3].length。而你的数组有arr[3]吗?所以角标越界了~~~

希望对你有帮助~~
作者: 官文昌    时间: 2012-8-3 19:39
一维数组取长度是数组名.length;二位数组可以看成是一维数组里面还有一维数组,你仔细看你的代码for (int x=0;x<arr[x].length ;x++ );这个代码;首先从书写来说就是错误的,为什么编译器没报错,是因为它没有语法错误,因改为:for (int x=0;x<arr.length ;x++ );他之所以会报角标越界,当你外循环运行x=2时,运行内循环,运行完后,x+1,x=3.这时候3<arr[3].length。而你的数组有arr[3]吗?所以角标越界了~~~

希望对你有帮助~~
作者: 杨洋    时间: 2012-8-3 20:11
问题已经解决
作者: 李知伦    时间: 2012-8-4 00:38
本帖最后由 李知伦 于 2012-8-4 00:49 编辑

用foreach不就可以避免这个问题了

  1. class ArrayTest {
  2.     public static void main(String[] args) {
  3.         int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
  4.         for(int[] i:arr){
  5.             for(int j:i){
  6.                 System.out.print(j);
  7.             }
  8.             System.out.println();
  9.         }        
  10.     }
  11. }
复制代码





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