2012-04-08 16 views
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); 
} 
} 

该数组比较每个元素并将较小的元素移动到较低的索引处。这可能是一个虚拟的问题。比较元素时发生异常,但我无法弄清楚原因。我写了一个通用的有序数组类,并且在比较元素时发生插入方法的空指针错误

+2

您可以添加异常错误消息和堆栈跟踪。 – mbaydar 2012-04-08 13:29:27

+0

那么,我只是测试你的代码,它工作正常。 – 2012-04-08 13:41:50

+0

是的例子“工作”没有错误。 Lior Barnea提供了一个很好的提示。我不知道它是否能解决你的问题。也许你应该检查'value'也不是null。 – 2012-04-08 13:51:52

回答

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

我想你应该有K>Ĵ

0

我的猜测是,当你插入你的第一个元素时,你正在比较一个[j]与要插入的元素。但是,由于第一次插入元素时[0]没有元素,所以会引发NPE。

您应该通过检查第一个元素是否为NULL来开始插入方法。如果[0] = NULL,你只需插入元素存在,否则你继续你比较陈述

+1

他已经检查过'a [j]!= null'! – 2012-04-08 13:40:13

0

您的代码为我工作。尝试在Linux上,jdk6和jdk7。
通常,比较方法可能会在您的代码中引发NPE的唯一方法是当您将null作为值传递时,因为您检查了[j]为null。确保您不会将null传递给insert方法。

0

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

对于所有x和y,实现者必须确保sgn(x.compareTo(y))== -sgn(y.compareTo(x))(这意味着x.compareTo(y)如果y.compareTo(x)抛出异常,则必须抛出异常。)

因此,如果您试图与null进行比较,则应该有一个NPE。

相关问题