0

我只是不确定如何解决这个问题。这是我收到的错误消息:

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() 返回下一次出现的日期。

我很确定我在这里缺少的东西非常简单,我在接口和比较器类方面还是新手。

谢谢您的帮助!

4

3 回答 3

4

您尚未共享的代码中有一个空 Date 对象...

顺便说一句,您可以大幅减小比较器的大小。基本上你在说什么

if (x<0)
  result = -1;
else if (x==0)
  result = 0;
else if (x>0)
  result = 1;

为什么不在您的特定示例中直接说result = x;Or :

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;
}
于 2011-02-27T16:48:10.917 回答
3

您的日程安排数组有一个空的 Date 对象?

编辑:我的意思是......一些“nextOccurence”返回一个null,它在java.util.Date类的“compareTo”上失败,因为“compareTo”调用“java.util.Date.getMillisOf”,它使用一个实例日期变量。

于 2011-02-27T16:43:57.330 回答
1

您正在露营的事件之一返回的 nextOccurreence 为空。修复比较器(或 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;  
     }   
}
于 2011-02-27T16:47:17.157 回答