今天一早就跑去请教了老师 还不错 一下就找到了问题的根源
其实也不是什么很深奥的问题 主要是我自己把算法写错了一点
不过差之毫厘谬以千里啊 反的错误确很严重
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 能有这样一些收获还是挺不错的
博主请教老师后找到Java算法问题根源,原是算法中数组循环条件写错致数组越界。将`for(int j=0;j<arr.length-i;j++)`改为`for(int j=0;j<arr.length-i-1;j++)`后正常。还学到通过打印循环变量观察执行情况来定位错误的方法。
441

被折叠的 条评论
为什么被折叠?



