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

あなたのコードは私のために働きます。Linux、jdk6、jdk7で試してみました。
一般に、compareメソッドがコードでNPEをスローする唯一の方法は、a [j]でnullをチェックするため、値としてnullを渡す場合です。insertメソッドにnullを渡さないように注意してください。

于 2012-04-08T13:48:58.513 に答える
0

私の推測では、最初の要素を挿入するときに、 a[j] を挿入する要素と比較しています。ただし、最初に要素を挿入するときに a[0] に要素がないため、NPE がスローされます。

最初の要素が NULL かどうかを確認して、挿入メソッドを開始する必要があります。a[0]=NULL の場合、そこに要素を挿入するだけです。それ以外の場合は、compare ステートメントを続行します

于 2012-04-08T13:38:18.797 に答える
0

Comparableインターフェイスのドキュメントを確認した場合。それは述べています:

実装者は、すべての x と y に対して sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) を保証する必要があります (これは、x.compareTo(y) が y.compareTo( x) 例外をスローします。)

したがって、何かを null と比較しようとすると、NPE が発生するはずです。

于 2012-04-08T14:10:00.307 に答える