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

共有していないコードに 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;
}

これも1行に短縮できます(それがあなたのスタイルである場合):

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

スケジュール配列にnullのDateオブジェクトがありますか?

編集:つまり...一部の「nextOccurence」はnullを返しますが、「compareTo」はインスタンスを使用する「java.util.Date.getMillisOf」を呼び出すため、java.util.Dateクラスの「compareTo」で失敗します。日付の変数。

于 2011-02-27T16:43:57.330 に答える
1

キャンペーン中のイベントの 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;  
     }   
}
于 2011-02-27T16:47:17.157 に答える