我只是不确定如何解决这个问题。这是我收到的错误消息:
Exception in thread "main" java.lang.NullPointerException
at java.util.Date.getMillisOf(Date.java:939)
at java.util.Date.compareTo(Date.java:959)
at FirstOccComparator.compare(FirstOccComparator.java:11)
at FirstOccComparator.compare(FirstOccComparator.java:1)
at java.util.Arrays.mergeSort(Arrays.java:1270)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.mergeSort(Arrays.java:1281)
at java.util.Arrays.sort(Arrays.java:1210)
at Planner.sort(Planner.java:62)
at Test.main(Test.java:81)
测试@第81行:
p.sort( new FirstOccComparator() );
其中p是我制作的策划者类。
Planner.sort @第62行:
public void sort(Comparator<AbstractEvent> c) {
Arrays.sort(schedule, c);
}
这是我的FirstOccComparator类: http://pastebin.com/4FZv4nXf (贴在pastebin上因为它太宽而且很难在这里格式化)。 在此类中,如果事件有更多的重复,则hasMoreOccurrences()返回true / false。 nextOccurrence()返回下一次出现的日期。
我很确定我在这里缺少的非常简单,我仍然是接口和比较器类的新手。
感谢您的帮助!
答案 0 :(得分:4)
您尚未共享的代码中有一个null Date对象...
请注意,您可以减小比较器的大小。基本上你正在做的是说
if (x<0)
result = -1;
else if (x==0)
result = 0;
else if (x>0)
result = 1;
为什么不只是说result = x;
或者在你的特定例子中:
public int compare(AbstractEvent event1, AbstractEvent event2) {
int result = 0;
if (event1.hasMoreOccurrences() && event2.hasMoreOccurrences())
result = event1.nextOccurrence().compareTo(event2.nextOccurrence());
return result;
}
这可以再次缩短(如果这是你的风格)到一行:
public int compare(AbstractEvent event1, AbstractEvent event2) {
return (event1.hasMoreOccurrences() && event2.hasMoreOccurrences()) ? event1.nextOccurrence().compareTo(event2.nextOccurrence()) : 0;
}
答案 1 :(得分:3)
您的日程表数组是否为null Date对象?
编辑:我的意思是......一些“nextOccurence”返回一个null,它在java.util.Date类的“compareTo”上失败,因为“compareTo”调用“java.util.Date.getMillisOf”,使用Date的实例变量。
答案 2 :(得分:1)
您正在营地的其中一个事件返回的nextOccurreence为null。修复比较器(或AbstractEvent类)以处理这种情况。
请注意,比较器的代码比它应该更复杂。你可以把它减少到
import java.util.Comparator;
public class FirstOccComparator implements Comparator<AbstractEvent> {
public int compare(AbstractEvent event1, AbstractEvent event2) {
int result = 0;
if (event1.hasMoreOccurrences() && event2.hasMoreOccurrences()) {
result = event1.nextOccurrence().compareTo(event2.nextOccurrence());
}
return result;
}
}