Java 我编写了一个通用的有序数组类,在比较元素时,insert方法出现空指针错误 公共类GenericOrderedArray{ 私人T[]a; 私人int n; 公共GenericOrderedArray(类clazz,int max){ a=(T[])Array.newInstance(clazz,max); n=0; } 公共空白插入(T值){ int j; 对于(j=0;j0) 打破 对于(int k=n;k

Java 我编写了一个通用的有序数组类,在比较元素时,insert方法出现空指针错误 公共类GenericOrderedArray{ 私人T[]a; 私人int n; 公共GenericOrderedArray(类clazz,int max){ a=(T[])Array.newInstance(clazz,max); n=0; } 公共空白插入(T值){ int j; 对于(j=0;j0) 打破 对于(int k=n;k,java,arrays,algorithm,generics,Java,Arrays,Algorithm,Generics,数组比较每个元素,并将较小的元素移动到较低的索引。这可能是个假问题。比较元素时会出现异常,但我不知道为什么。我猜,当您插入第一个元素时,您正在将[j]与要插入的元素进行比较。但是,由于第一次插入元素时[0]处没有元素,因此将抛出NPE 您应该通过检查第一个元素是否为NULL来启动insert方法。如果[0]=NULL,则只需在此处插入元素,否则继续使用(int k=n;**kj你的代码适合我。在Linux、jdk6和jdk7上试用。 通常,compare方法在代码中抛出NPE的唯一方法是将nul

数组比较每个元素,并将较小的元素移动到较低的索引。这可能是个假问题。比较元素时会出现异常,但我不知道为什么。

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

您应该通过检查第一个元素是否为NULL来启动insert方法。如果[0]=NULL,则只需在此处插入元素,否则继续使用(int k=n;**kpublic 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); } } a[k]=a[k-1];
我想你应该有k>j你的代码适合我。在Linux、jdk6和jdk7上试用。
通常,compare方法在代码中抛出NPE的唯一方法是将null作为值传递,因为您检查[j]是否为null。如果检查接口文档,请确保不要将null传递给insert方法。

。它说:

实现者必须确保所有x和y的sgn(x.compareTo(y))==-sgn(y.compareTo(x))(这意味着x.compareTo(y)必须在y.compareTo(x)引发异常时引发异常。)


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

您是否可以添加异常错误消息和堆栈跟踪。我刚刚测试了您的代码,它工作正常。是的,示例“工作”没有错误。Lior Barnea提供了一个很好的提示。我不知道这是否能解决你的问题。也许您应该检查
是否也不为null。您实际上不需要
数组。newInstance
或组件的类
for (int k = n; **k < j**; k--)
    a[k] = a[k - 1];