我面临的代码问题在哪里 数组索引越界 问题?

Where is the problem in code for which I am facing Array Index out of Bounds problem?

提问人:Samik Pandit 提问时间:6/27/2022 最后编辑:Lajos ArpadSamik Pandit 更新时间:6/28/2022 访问量:129

问:

我在用 Java 语言编码的合并排序中遇到了一个问题。请你看看我错了哪里,因为我面临索引越界问题。 我正在分享代码。请检查 !

输出框中的错误是:

“线程”main“java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 1 超出长度 1 的范围”

代码 : code

import java.util.Arrays;

public class Sorting {

    public static void main(String[] args) {
        int[] arr = {5,3,4,7,2,8,6,9,1};
        mergesort(arr);
    }


static void mergesort(int[] arr){

        mergesortalgorithm(arr,0, arr.length);
        System.out.println("The sorted array is :" + Arrays.toString(arr));
    }
    static void mergesortalgorithm(int[] arr,int lb,int ub){
        if (lb < ub){
            int mid = (lb + ub)/2;
            mergesortalgorithm(arr,lb,mid);
            mergesortalgorithm(arr,mid + 1,ub);
            merge(arr,lb,mid,ub);
        }
    }
    static void merge(int[] arr,int lb,int mid,int ub){
        int i = lb;
        int j = mid + 1;
        int k = 0;
        int[] newarray = new int[lb + ub];
        while (i <= mid && j <= ub){
            if (arr[i] <= arr[j]){
                newarray[k] = arr[i];
                i++;
            }
            else {
                newarray[k] = arr[j];
                j++;
            }
            k++;
        }
        if (i > mid){
            while (j <= ub){
                newarray[k] = arr[j];
                j++;
                k++;
            }
        }
        else {
            while (i <= mid){
                newarray[k] = arr[i];
                i++;
                k++;
            }
        }
        for (int l = lb;l <= ub;l++){
            arr[l] = newarray[l];
        }
    }
}
排序 合并排序 数组索引OutofboundsException

评论

0赞 Lajos Arpad 6/27/2022
哪一行抛出错误?
0赞 Samik Pandit 6/27/2022
调试时,行 int[] newarray = new int [lb+ub]
0赞 Lajos Arpad 6/28/2022
这是不可能的,因为您给出的行创建了一个新数组,并且当违反已经存在的 (!) 数组的边界时,会抛出您遇到的错误。在测试您的代码时,此行为我抛出了错误。newarray[k] = arr[i];

答:

0赞 Lajos Arpad 6/28/2022 #1

ArrayIndexOutOfBoundsException 是当您尝试使用超出其边界的无效索引访问数组的项时引发的异常。

元素数组的第一个元素索引为 0,第二个元素索引为 1,依此类推,最后一个索引为 n - 1。

所以,假设你有一个数组,它有 9 个元素。这意味着,尝试访问具有负索引的元素(例如 )或尝试访问超过 8 的任何项(例如 或 )将引发 'ArrayIndexOutOfBoundsException。int[] arr = {5,3,4,7,2,8,6,9,1}arr[-4]arr[9]arr[234]

克服此类错误的一个非常简单的方法是找到它发生的确切行,例如

newarray[k] = arr[i];

并且看到当变为 1 时,则具有单个元素的 ,不能引用它,因为它具有单个元素,索引为 0。因此,为了解决这个问题,人们很想添加安全检查,以确保您永远不会越过界限,例如knewarray

while ((i <= mid && j <= ub) && (i < arr.length) && (j < arr.length)){

最终达到句法正确

static void merge(int[] arr,int lb,int mid,int ub){
    int i = lb;
    int j = mid + 1;
    int k = 0;
    int[] newarray = new int[lb + ub];
    while ((i <= mid && j <= ub) && (i < arr.length) && (j < arr.length)){
        if (arr[i] <= arr[j]){
            newarray[k] = arr[i];
            i++;
        }
        else {
            newarray[k] = arr[j];
            j++;
        }
        k++;
    }
    if (i > mid){
        while ((j <= ub) && (k < newarray.length) && (j < arr.length)){
            newarray[k] = arr[j];
            j++;
            k++;
        }
    }
    else {
        while ((i <= mid) && (k < newarray.length)){
            newarray[k] = arr[i];
            i++;
            k++;
        }
    }
    for (int l = lb;(l <= ub) && (l < newarray.length) && (l < arr.length);l++){
        arr[l] = newarray[l];
    }
}

,但这只能解决语法问题,不会触及您遇到的逻辑问题,并且会产生不正确的结果。所以,很明显,你的问题不在于让索引越界异常,它只是症状。实际问题出在逻辑上。[0, 0, 0, 0, 0, 0, 3, 3, 0]

所以,你有一些错误的假设。但它可能是什么?对于初学者,你有这样一行:

mergesortalgorithm(arr,0, arr.length);

想想这一行:第一项是第 0 项,而最后一项是第 arr.length 项。你这里有多少件物品?总共 arr.length + 1 个项目。这意味着当您引用最后一项时,您肯定会越界。因此,您需要修复您的逻辑,最后,如果您的算法保证在适当的范围内工作,您很可能甚至不需要进行语法安全检查。上面的行应改为

mergesortalgorithm(arr,0, arr.length - 1);

此外,您还需要跟踪索引是如何更改的,尤其是您是如何准确实现算法的。k