尝试获取数组中的最大值时出错

时间:2017-03-01 20:50:36

标签: java arrays sorting

所以我试图在类型“T”数组列表中返回最大值,并在使用compareTo时出错。这是完整的代码。

package myUtil;

public class SimpleListAry<T extends java.lang.Comparable<T>> extends java.lang.Object implements SimpleList<T> {
    private T[] myList;
    private int size;
    public SimpleListAry(){
       myList = (T[])new Comparable[10];
    }
    public SimpleListAry(int capacity){
        if (capacity <= 0){
            throw new IllegalArgumentException();
        }
        myList = (T[]) new Object [capacity];
    }

    @Override
    public int size() {
        size = myList.length;
        return size;
    }
    @Override
    public T get(int i) {
        return myList[i];
    }

    @Override
    public T set(int i, T item) {
        return myList[i] = item;
    }

    @Override
    public int indexOf(Object item) {
        for (int i = 0; i < size; i++){
            if (get(i).equals(item)){
                return i;
            }
        }
      return -1;
    }

    @Override
    public void add(int at, T item) {
        if (at < 0 || at > size)
            throw new ArrayIndexOutOfBoundsException(at);
        for (int i = size; i > at; i--){
            myList[i] = myList [i-1];
        }
//        myList[at] = item;
        size++;
    }


    @Override
    public T remove(int at) {
        if (at < 0 || at >= size)
            throw new ArrayIndexOutOfBoundsException(at);
        T item = myList[at];
        for (int i = at; i<size-1; i++)
            myList[i] = myList[i+1];
        size--;
        return item;
    }

    @Override
    public T max() {
        T max = myList[0];
        for (int i = 1; i < myList.length; i++){
            if(myList[i].compareTo(max) == 1)
                max = myList[i];
        }
        return max;
    }

    @Override
    public T min() {
        T min = myList[0];
        for (int i = 1; i < size -1; i++){
            if (myList[i].compareTo(min) == -1)
                min = myList[i];
        }
        return min;
    }


}

,错误发生在Public T max():

public T max() {
T max = myList[0];
for (int i = 1; i < myList.length; i++){
    if(myList[i].compareTo(max) == 1)
        max = myList[i];
}
return max;

}

我也尝试过使用“&gt;”比较它们,但那也没有用。可能是因为数据类型,但只有当我尝试运行它并且它直接指向T max(){

中的这一行时,IDE中没有错误
if(myList[i].compareTo(max) == 1)

1 个答案:

答案 0 :(得分:1)

if(myList[i].compareTo(max) == 1)

中空指针的三种可能性
  1. myList - 在构造函数中初始化,而不是null
  2. myList[i] - 列表最初填充为null!
  3. max,根据compareTo的实施方式 - 初始化为myList[0],如果列表为空则可以为空
  4. 第二种情况是问题,因为在不考虑列表的实际大小的情况下比较整个底层数组的元素。

    size()方法错误,因为它将返回的size变量设置为覆盖正确值的数组长度。

    只需删除size()方法中的赋值语句(并在比较循环中使用该方法)