0
public class GenericOrderedArray<T extends Comparable<T>> {

private T[] a;
private int n;

public GenericOrderedArray(Class<T> clazz, int max) {
    a = (T[]) Array.newInstance(clazz, max);
    n = 0;
}

public void insert(T value) {
    int j;
    for (j = 0; j < n; j++)
                    //this is where error goes ,the compare to method throws a null pointer exception
        if (a[j] != null && a[j].compareTo(value) > 0)
            break;
    for (int k = n; k < j; k--)
        a[k] = a[k - 1];
    a[j] = value;
    n++;
}

public boolean delete(T value) {
    boolean result = false;
    int hit = find(value);
    if (hit == -1)
        return result;
    else {
        for (int i = hit; i < n; i++) {
            a[i] = a[i + 1];
        }
        n--;
    }
    return result;
}


    //binary search implements find method 
public int find(T value) {
    int lowerBound = 0;
    int upperBound = n - 1;
    int curIn;
    while (true) {
        curIn = (lowerBound + upperBound) / 2;
        if (a[curIn].equals(value))
            return curIn;
        else if (lowerBound > upperBound) {
            return -1;
        } else {
            if (a[curIn].compareTo(value) < 0)
                lowerBound = curIn + 1;
            else {
                upperBound = curIn - 1;
            }
        }
    }

}

public static void main(String[] args) {
    int max = 100;
    GenericOrderedArray<Integer> ints = new GenericOrderedArray<>(Integer.class, max);
    ints.insert(2);
    ints.insert(4);
    ints.insert(1);
}
}

该数组比较每个元素并将移动的较小元素放到较低的索引中。这可能是一个愚蠢的问题。比较元素时发生异常,但我不知道为什么。

4

4 回答 4

1
for (int k = n; **k < j**; k--)
    a[k] = a[k - 1];

我认为你应该有k > j

于 2012-04-08T13:43:34.727 回答
0

我的猜测是,当您插入第一个元素时,您将 a[j] 与要插入的元素进行比较。但是,由于第一次插入元素时 a[0] 处没有元素,因此将抛出 NPE。

您应该通过检查第一个元素是否为 NULL 来启动插入方法。如果 a[0]=NULL 您只需在其中插入元素,否则您继续比较语句

于 2012-04-08T13:38:18.797 回答
0

你的代码对我有用。在 Linux、jdk6 和 jdk7 上试过。
通常,比较方法可能在代码中抛出 NPE 的唯一方法是当您将 null 作为值传递时,因为您检查 a[j] 是否为 null。确保您没有将 null 传递给 insert 方法。

于 2012-04-08T13:48:58.513 回答
0

如果您检查Comparable接口文档。它指出:

实现者必须确保所有 x 和 y 的 sgn(x.compareTo(y)) == -sgn(y.compareTo(x))。(这意味着 x.compareTo(y) 必须抛出异常 iff y.compareTo( x) 抛出异常。)

因此,如果您尝试将任何内容与 null 进行比较,则应该存在 NPE。

于 2012-04-08T14:10:00.307 回答