Java - 为什么在一个 运行 上抛出异常而在另一个上不抛出异常?

Java - Why an exception is thrown on one run and doesn't on another ??

我正在使用快速排序算法对数组列表进行排序,这是我在 QuickSort.java 中的代码:

public class QuickSort {

public ArrayList<Integer> quickSort(ArrayList<Integer> data , int low , int high){

    ArrayList<Integer> sortedData = new ArrayList<Integer>();

    if(low< high) {
        int pivotIndex = low; // Assume first element is the pivot
        int pivot = data.get(low);// The pivot value
        data.set(pivotIndex, data.get(high));// Swap pivot with last item
        data.set(high, pivot);
        int i = low - 1;
        int j = high;

        do {                
            do {i++;} while (data.get(i)< pivot);

            do {j--;} while (data.get(j)> pivot); //line 35
            if (i < j) {
                int temp = data.get(i);
                data.set(i, data.get(j));
                data.set(j, temp);

            }

        } while (i < j);

        data.set(high, data.get(i));  // Put the pivot back in the middle
        data.set(i, pivot);

        quickSort(data, low, i - 1);// Recursive sort left list
        quickSort(data, i + 1 ,high);// Recursive sort right list
    }

    sortedData = data;

    return sortedData ; 
}
}

主要 class :

// sort random data with quick sort

    QuickSort q = new QuickSort();

    ArrayList<Integer> quickSortedD = new ArrayList<Integer>();

    System.out.println("randomD before q s "+ randomD );
    int low = 0;
    int high = randomD.size() -1 ;

    System.out.println("high :  " + high);

    quickSortedD = q.quickSort(randomD ,low, high); // low is the first element and high is the last element in the arraylist

    System.out.println("quickSortedD" + quickSortedD);

randomD 是每个 运行 随机生成的数组列表,但大小固定为 1500 。

问题是: 当我 运行 文件时,有时会抛出异常,有时会成功构建!!

抛出的异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:422)
at java.util.ArrayList.get(ArrayList.java:435)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:35)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48)
at sortingtechniques.SortingTechniques.main(SortingTechniques.java:104)

/home/gfdg/.cache/netbeans/8.2/executor-snippets/run.xml:53: Java 返回:1 构建失败(总时间:0 秒)

QuickSort.java:35 :

do {j--;} while (data.get(j)> pivot);

QuickSort.java:48 :

quickSort(data, low, i - 1);// Recursive sort left list

SortingTechniques.java:104 :

quickSortedD = q.quickSort(randomD ,low, high);

为什么会发生这种情况,我该如何解决??

原因是我没有对{j --;}进行限制

所以它有时会继续递减为 -1

将其更改为后现在可以使用了:

do {j--;} while (j>=0 && data.get(j)> pivot);