数组索引越界java堆

数组索引越界java堆,java,arrays,heap,Java,Arrays,Heap,我知道这是一个错误,我明白这意味着什么,但我不明白为什么我不能修复它。我什么都试过了。我试图获取一个类型为T的数组,并切换其值,使其正确地对应于堆的规则,其中父数组总是大于2个子数组。错误在我的while循环中 请不要苛刻,如果它的东西很容易修复。我一直在苦苦挣扎,似乎找不到答案 public class myheap<T extends Comparable<T>> extends heap<T> { // constructors of the

我知道这是一个错误,我明白这意味着什么,但我不明白为什么我不能修复它。我什么都试过了。我试图获取一个类型为T的数组,并切换其值,使其正确地对应于堆的规则,其中父数组总是大于2个子数组。错误在我的while循环中

请不要苛刻,如果它的东西很容易修复。我一直在苦苦挣扎,似乎找不到答案

public class myheap<T extends Comparable<T>> extends heap<T>
{ 
    // constructors of the subclass should be written this way:
    public myheap(int max) { super(max); }
    public myheap(T[] A) {super(A);}  


    public void buildheap(T[] Arr){ 
        int size = Arr.length;
        int startsize = (size-1)/2;
        for(int i=startsize;i>0;i--){
            int l = left(i);
            int r = right(i);
            T temp = null;
            while((Arr[r]!=null) && Arr[i].compareTo(Arr[r])<0){
                if (Arr[l].compareTo(Arr[r])>0){
                    temp = Arr[l];
                    Arr[l] = Arr[i];
                    Arr[i] = temp;
                }//if left is greater than right
                else        //then right must be greater than parent            
                    temp = Arr[r];
                    Arr[r] = Arr[i];
                    Arr[i] = temp;
            }//whileloop
            if((Arr[r]==null) && Arr[i].compareTo(Arr[l])<0)
                temp = Arr[l];
                Arr[l] = Arr[i];
                Arr[i] = temp;
        }//for

    }//buildheap


    public static void main(String[] args){
        String[] array = {"SH","AH","AB","YA","AY","AA","AB","LM","LL","LO"};
        myheap<String> New = new myheap<String>(array.length);
        for(int i=0;i<array.length;i++){
            New.insert(array[i]);
        }//insert
        New.buildheap(array);
        New.drawheap();
        for(int i=0;i<array.length;i++){
            System.out.println(New.deletemax() + "  ");
        }//for
        System.out.println();

    } //main

}
公共类myheap扩展heap
{ 
//子类的构造函数应该这样编写:
公共myheap(int max){super(max);}
公共myheap(T[]A){super(A);}
公共void构建堆(T[]Arr){
int size=Arr.length;
int startsize=(大小1)/2;
对于(int i=startsize;i>0;i--){
int l=左(i);
int r=右(i);
温度=零;
while((Arr[r]!=null)和&Arr[i].compareTo(Arr[r])0){
温度=Arr[l];
Arr[l]=Arr[i];
Arr[i]=温度;
}//如果左大于右
else//则right必须大于parent
温度=Arr[r];
Arr[r]=Arr[i];
Arr[i]=温度;
}//whileloop

如果((Arr[r]==null)&&Arr[i].compareTo(Arr[l])您可以在
循环时检查
中的null(
Arr[r]!=null
)但问题是,您甚至无法从数组中获取值来确定它是否为
null
。在尝试从数组中访问值之前,应使用
r
或类似工具检查索引是否在范围内。

(如果为null)不是问题吗,arrayIndexOutofBounds表示您正在获取一个不存在的数组的值 Array.length=5;您可以搜索数组[6];-超出范围

我认为问题在于你的方法是正确的(i); 也就是。i*2+2和数组

所以把for循环改成这个

 for(int i=startsize-2;i>0;i--)

如果这有帮助,请发表评论。

你试过调试你的应用程序吗?
2*i+2
最终将大于你数组的大小。例如
11
元素数组,
i
将循环
0->5
,而
2*i+2
将求值为
12
数组索引越界异常:10,@MarcB这就是我指定的原因如果Arr[r]!=null或如果为null,则为fy,这是无意义的。Arr[12]!=null将失败,因为您已经超过了数组的末尾。java甚至不会费心测试null,因为您显然已经超过了数组的大小。您基本上表现得像wiley coyote,不知道为什么从人行道的尽头跑下来后会摔倒。这是很多代码供我们查看。@SotiriosDelimanolis建议调试代码是最好的第一步,因此我想确保我的左右两个孩子不会返回一个与我的数组大小不符的i值?@BenjiWeiss可能吗?我没有时间阅读你的所有代码,但上面是跳出的内容。通常每当你访问数组的元素时,你都需要索引是一个合法的值。我正确地确保r和l小于size,但现在我在同一while循环中得到了一个空指针异常,我运行了它,多亏了你的帮助,谢谢你,伙计,非常感谢。我没有更改我的for循环,而是嵌套了while循环以确保我的索引保持在绑定状态。我现在的问题是,我得到了它g同一while循环中的null指针异常
 for(int i=startsize-2;i>0;i--)