0

我正在编写代码以从文件中读取一些记录并以特殊方式对它们进行排序。我尝试了这样的代码:

public class Main {

    static class judgement implements Comparable<judgement> {
        public int q;
        public int d;
        public int r;

        public int compareTo(judgement j) {
            int k = ((judgement) j).q;
            return 0;
        }
    }

    public static void method() throws Exception {
        judgement[] judgements;
        judgements = new judgement[18425];
        try {
            // fill the "judgements" array
        } finally {
            Arrays.sort(judgements);
        }
    }

    public static void main(String[] args) throws Exception {
        method();
    }

}

但是我在函数 compareTo 中得到错误NullPointerException 。有人可以帮我解决这个问题吗?

4

4 回答 4

5

那是因为数组中填充了空指针。比较器无法将空对象相互比较。

创建数组不会初始化数组的每个元素。

于 2012-04-14T19:43:03.860 回答
2

确保数组中只有关于 compareTo() 实现的非空元素。否则,在您的函数 compareTo() 中,对假定的现有判断调用“q”属性会导致 NullPointerException。

此外,避免使用选项卡,更喜欢使用集合。在您的情况下,您可以使用 TreeSet 对象而不是数组,因为它们在内部使用元素的 compareTo() 方法。

于 2012-04-14T19:45:17.970 回答
2

您正在使用空值初始化数组。

judgements = new judgement[18425];

并且您没有检查 null 值。你必须使用 if 语句。

public int compareTo(judgement j) {
          int k =0;
    if(j!=null){
    k = ((judgement) j).q;
    } 

                return 0;
            }
于 2012-04-14T19:46:25.413 回答
2

可能发生的是您的数组的某些元素是null.

在您的compareTo函数中包含一个空检查是一种很好的做法。此外,现在你的compareTo函数是非功能性的:它总是返回 0 - 这就像说所有项目都是平等的。

您的另一个问题是,您似乎正在将 atry{}finally{}用于不应该用于的事物。

于 2012-04-14T19:58:03.260 回答