【问题标题】:ArrayOutOfBounds Exception Merge SortArrayOutOfBounds 异常合并排序
【发布时间】:2017-02-15 01:56:31
【问题描述】:

我正在处理合并排序,并且正在抛出 ArrayIndexOutOfBoundsException。我一直在梳理代码寻找错误,但找不到它。异常堆栈跟踪说它来自我在第 77 行的合并函数,即temp[current3++] = list2[current2++];。第 102 行是 merge(firstHalf, secondHalf, list);,第 93 行是 mergeSortRoutine(firstHalf);。非常感谢任何和所有帮助。感谢您的时间。

下面是两个函数:

//this function will merge two arrays
private static void merge(Integer[] list1, Integer[] list2, Integer[] temp){
    int current1 = 0; //current index in list1
    int current2 = 0; //current index in list2
    int current3 = 0; //current index in temp

    while((current1 < list1.length) && (current2 < list2.length)){

        if(list1[current1].intValue() < list2[current2].intValue()){
            temp[current3++] = list1[current1++];
        }
        else{
            temp[current3++] = list2[current2++];
        }
    }

    while(current1 < list1.length){
        temp[current3++] = list2[current2++];
    }

    while(current2 < list2.length) {
        temp[current3++] = list2[current2++];
    }
}

//merge sort function
private static void mergeSortRoutine(Integer[] list){

    if(list.length > 1){

        //merge sort the first half
        Integer[] firstHalf = new Integer[(list.length)/2];
        System.arraycopy(list, 0, firstHalf, 0, (list.length)/2);
        mergeSortRoutine(firstHalf);

        //merge sort the second half
        int secondHalfLength = list.length - ((list.length)/2);
        Integer[] secondHalf = new Integer[secondHalfLength];
        System.arraycopy(list, (list.length)/2, secondHalf, 0, secondHalfLength);
        mergeSortRoutine(secondHalf);

        //merge firstHalf with secondHalf into list
        merge(firstHalf, secondHalf, list);
    }
}

下面是堆栈跟踪:

java.lang.ArrayIndexOutOfBoundsException: 1
at Merge.merge(Merge.java:77)
at Merge.mergeSortRoutine(Merge.java:102)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.mergeSortRoutine(Merge.java:93)
at Merge.main(Merge.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

【问题讨论】:

  • 您在 loop 中检查 current2 &lt; list2.length 但随后您将其设置为更高的值 list2[current2++]
  • @ScaryWombat 太棒了!谢谢你额外的一双眼睛。得到它的工作!再次感谢

标签: java arrays exception mergesort


【解决方案1】:

正如可怕的袋熊所说,在您的最后一个 while 循环中,您正在检查 current2,然后将其递增。

除此之外,您还在倒数第二个while 循环while(current1 &lt; list1.length) 中递增current2。我想你可能打算把那个声明写成temp[current3++] = list1[current1++]

【讨论】:

  • 太棒了!谢谢你额外的一双眼睛!我让它工作了。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2015-12-10
  • 2015-12-15
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多