A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨洋 初级黑马   /  2012-8-3 18:02  /  3514 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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)

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 神马都是浮云

查看全部评分

15 个回复

倒序浏览
这样就行了,先是数组的长度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. }
复制代码
回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  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:11

如果把数组变为int[][] arr=new int[][]{{1,2,3,},{4,5,6},{7,8,9,10}}
这个问题该如何解决
回复 使用道具 举报
杨洋 发表于 2012-8-3 18:25
如果把数组变为int[][] arr=new int[][]{{1,2,3,},{4,5,6},{7,8,9,10}}
这个问题该如何解决 ...

应该没有影响,照样可以输出,不用改,内存循环可以取到值。不会越界的。
回复 使用道具 举报
周坤 发表于 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:39
不行啊,是输出了,还多一行
123
456

怎么可能,把错误的代码改过来了吗?
把arr[x].length改成arr.length。
回复 使用道具 举报
周坤 发表于 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没有打印
回复 使用道具 举报
不能用arr[x] 啊 , 你算一下嘛,  数组下标是从0开始, 比如 for只循环到10   x=10   然后你数10次 0-9 刚好10次, 那你数到10的时候 你觉得数组里还有值么?

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

回复 使用道具 举报
杨洋 发表于 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();
    }
}
}
回复 使用道具 举报
再简单点的说,  程序中的arr[].length 的值为=3;
循环3次  x=0 , arr[0]      x=1 , arr[1]  x=2 , arr[2]  刚好3次,  

arr[3]   这里是第4次了.. 第4次 数组里已经没有值了 所以就越界了
回复 使用道具 举报
一维数组取长度是数组名.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]吗?所以角标越界了~~~

希望对你有帮助~~
回复 使用道具 举报
一维数组取长度是数组名.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-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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马