Java编译器无任何理由调用Java.lang.ArrayIndexOutOfBoundsException

Java编译器无任何理由调用Java.lang.ArrayIndexOutOfBoundsException,java,arrays,eclipse,merge,queue,Java,Arrays,Eclipse,Merge,Queue,我是Java新手。我正在尝试为自定义PriorityQueue创建一个方法,该方法必须使用一个数组,该数组合并2个PriorityQueue 问题是,尽管我的代码中没有错误,但每当我在main中调用Java.lang.ArrayIndexOutOfBoundsException方法时,Eclipse中的Java编译器都会调用Java.lang.ArrayIndexOutOfBoundsException 关于合并方法: 它基本上是一种方法,它将两个数组的元素合并到一个数组中。然后使用extrac

我是Java新手。我正在尝试为自定义PriorityQueue创建一个方法,该方法必须使用一个数组,该数组合并2个PriorityQueue

问题是,尽管我的代码中没有错误,但每当我在main中调用Java.lang.ArrayIndexOutOfBoundsException方法时,Eclipse中的Java编译器都会调用Java.lang.ArrayIndexOutOfBoundsException

关于合并方法: 它基本上是一种方法,它将两个数组的元素合并到一个数组中。然后使用extractMax方法擦除第二个数组的所有元素:

到目前为止,我的代码是:

//Custom Priority Queue
class PriorityQueue {
    private int capacity;
    private int queue[];
    private int i;

    public PriorityQueue() {
        capacity = 100;
        queue = new int[100];
        i = 0;
    }

    public PriorityQueue(int size) {
        capacity = size;
        queue = new int[size];
        i = 0;
    }

    protected void quickSort(int left, int right) {
        int i = left, j = right;
        int pivot = queue[(left + right) / 2];

        while (i <= j) {
            while (queue[i] > pivot)
                i++;
            while (queue[j] < pivot)
                j--;
            if (i <= j) {
                int temp = queue[i];
                queue[i] = queue[j];
                queue[j] = temp;
                i++;
                j--;
            }
        }
        if (left < j)
            quickSort(left, j);
        if (i < right)
            quickSort(i, right);
    }

    public boolean insert(int number) {
        if(i < capacity) {
            queue[i] = number;
            quickSort(0, i++);
            return true;
        }
        return false;
    }

    public int extractMax() {
        if(i == 0)
            return -1;
        else {
            int tempQueue[] = new int[i-1];
            int temp = queue[0];

            for(int j=0; j<i-1; j++)
                tempQueue[j] = queue[j+1];
            queue = tempQueue;
            i--;
            return temp;
        }
    }

    public boolean merge(PriorityQueue myPriorityQueue) {
        if(i + myPriorityQueue.i < capacity) {
            for(int j=0; j<myPriorityQueue.i; j++)
                queue[i++] = myPriorityQueue.extractMax();
            quickSort(0, i-1);
            return true;
        }       
        return false;
    }

//Test Class
class PriorityQueueTest
{
    public static void main(String args[])
    {
        PriorityQueue PQ1 = new PriorityQueue();
        PriorityQueue PQ2 = new PriorityQueue();

        PQ1.insert(1);
        PQ1.insert(3);
        PQ1.insert(5);
        PQ2.insert(2);
        PQ2.insert(4);
        PQ2.insert(6);

        PQ1.merge(PQ2);     
    }
}
我试图弄明白它为什么会这样,但毫无意义。 在本例中,2个PriorityQueues的长度不超过PriorityQueue1的容量。当我尝试访问PriorityQueues元素时,一定是出了什么问题

谢谢,非常感谢您的帮助。

问题在这里:

for(int j=0; j<myPriorityQueue.i; j++)
            Queue[i++] = myPriorityQueue.extractMax();
        QuickSort(0, i-1);
        return true;
这种方式将只访问
队列[]
中的元素,直到
i
,并且
j
在循环的每次迭代结束时自动递增


当循环中经常使用诸如
i
j
这样的单个字母时,如果您选择使用
i
作为类变量之一来跟踪队列中有多少东西,而不是像
排队
存储
这样更具描述性的变量,事情就会变得更加混乱;实际上,您确实在快速排序循环中使用了
i
,而您的类也已经有了一个变量
i
。对于循环计数器之外的变量使用非描述性名称是一种不好的做法,这会使代码更难理解。

哪一行是第89行?sry,实际上是第88行,而第88行是:Queue[i++]=myPriorityQueue.extractMax();你试过逐行调试你的代码吗?只是想澄清一下-编译器不会调用异常,这发生在运行时,正确的术语是“抛出”异常。编译器会为您做其他事情,例如检查您试图访问的索引是否为整数,但它不知道该索引是否存在。只有在程序运行时才能验证这一点。在这一点上,编译器已经完成了它的工作,并且已经超出了范围。因此,当我更改变量“I”时,我也更改了变量“myPriorityQueue.I”。。。你说得对,非常感谢你,伙计!!!!
for(int j=0; j<myPriorityQueue.i; j++)
            Queue[i++] = myPriorityQueue.extractMax();
        QuickSort(0, i-1);
        return true;
for(int j=0; j<myPriorityQueue.i; j++)
            Queue[j] = myPriorityQueue.extractMax();
        QuickSort(0, i-1);