qq_42649008
2019-09-04 23:22
采纳率: 33.3%
浏览 261
已采纳

java小白写for循环时加入swap编译通过,执行报错

class demo0503
{
public static void printArray(int[] arr)
{
System.out.print("[");
for (int x=0;x<arr.length;x++)
{
if(x!=arr.length-1)
System.out.print(arr[x]+", ");
else
System.out.println(arr[x]+"]");
}

}
public static void main(String[] args)
{   
int[] arr={33,77,57,66,44,88,55};
printArray(arr);
selectSort(arr);
printArray(arr);

}
public static void swap(int[] arr,int a,int b)
{
    int temp=arr[a];
    arr[a]=arr[b];
    arr[b]=temp;
}
    public static void selectSort(int[] arr)
{
    for (int x=0;x<arr.length-1;x++ )
    {
    for(int y=x+1;y<arr.length;y++)
        {
            if(arr[x]>arr[y])
            {
                swap(arr,y,y+1);
            }
        }
    }
}
错误如下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
    at demo0503.swap(demo0503.java:31)
    at demo0503.selectSort(demo0503.java:43)
    at demo0503.main(demo0503.java:24)

求助老鸟解答,java版本12

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 毕小宝 2019-09-05 08:47
    已采纳

    代码有问题,数组越界了。内层循环结束条件 y < arr.length ,而你后面后面交换时用的交换的是 y, y+1,改成 y-1,y 试试:

     for(int y=x+1;y<arr.length;y++)
            {
                if(arr[x]>arr[y])
                {
                    swap(arr,y-1,y);//保证 y-1 在数组长度范围内
                }
            }
        }
    
    
    点赞 打赏 评论
  • qq_22847605 2019-09-05 10:42

    selectSort函数中的第二层for循环y变量, y < arr.length 代表y的值最后一次循环可以是y = arr.length - 1,此时 y + 1 = arr.length , 显然arr[arr.length]的元素是不存在的,可见数组索引已越界了

    点赞 打赏 评论
  • java-zh 2019-09-05 11:03

    这个错误叫数组下标越界错误,因为你的y判断条件是y<arr.length。循环最后一次的时候是arr.length-1。但是你的循环里面有y+1,那么这样显然会造成越界。打个比方,你这里的数组长度是7,那么他最大下标是6,因为数组的下标是在0开始的。当最后一次循环的时候,6<7那么条件成立,进入循环6+1=7。很显然下标为7的数组不存在,所以就会报错。

    点赞 打赏 评论

相关推荐 更多相似问题