终于解决昨天的问题了

博主请教老师后找到Java算法问题根源,原是算法中数组循环条件写错致数组越界。将`for(int j=0;j<arr.length-i;j++)`改为`for(int j=0;j<arr.length-i-1;j++)`后正常。还学到通过打印循环变量观察执行情况来定位错误的方法。

今天一早就跑去请教了老师 还不错 一下就找到了问题的根源

其实也不是什么很深奥的问题 主要是我自己把算法写错了一点

不过差之毫厘谬以千里啊 反的错误确很严重

int arr[] = {95,23,45,66,79,84,100,54,87,67,94,81,83,76,84,66,88,91,25,77,84,22,56,78,49,83,89,86,84,44};

  for(int i=0;i<arr.length-1;i++)
  {
   for(int j=0;j<arr.length-i;j++)
   {
    if(arr[j]<arr[j+1])
    {
     int t=arr[j];
     arr[j]=arr[j+1];
     arr[j+1]=t;
    }
   }
  }

以上是有问题的程序

出错的一句是   for(int j=0;j<arr.length-i;j++)

arr.length=30    因为java的数组下标是从0--n-1 所以数组下标最大也就29

当i=0,j=0的时候 j 可以等于29  j<arr.length-i 成立

所以当执行if(arr[j]<arr[j+1])一句的时候就出错了

因为arr[j+1]=arr[30]越界了

找到了问题的关键就好办了

将for(int j=0;j<arr.length-i;j++) 改为for(int j=0;j<arr.length-i-1;j++)之后一切正常哈

在这次调试的过程中 从老师那里学来了一个方法

在if(arr[j]<arr[j+1])这句之上加上System.out.print('i='+i);System.out.print('j='+j);

可以观察出整个循环体的执行情况

这个时候的出错信息如下:

i=0 j= 0
i=0 j= 1
i=0 j= 2
i=0 j= 3
i=0 j= 4
i=0 j= 5
i=0 j= 6
i=0 j= 7
i=0 j= 8
i=0 j= 9
i=0 j= 10
i=0 j= 11
i=0 j= 12
i=0 j= 13
i=0 j= 14
i=0 j= 15
i=0 j= 16
i=0 j= 17
i=0 j= 18
i=0 j= 19
i=0 j= 20
i=0 j= 21
i=0 j= 22
i=0 j= 23
i=0 j= 24
i=0 j= 25
i=0 j= 26
i=0 j= 27
i=0 j= 28
i=0 j= 29
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 30
        at Sort.main(Sort.java:13)

所以可以很直观的看出 外层循环一次都没有执行完

内层循环当执行到j=29的时候就出错了

这个时候就可以在这条语句附近寻找错误

相当方便

毕竟是初学java 能有这样一些收获还是挺不错的



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值