1


複数のスレッドでこの問題を発見し、提案された返信を試みました。しかし、成功しませんでした。

私のコードは以下のとおりです。

@Override
public int compareTo(CustomObject o) {
    try {
        if (getOriginalActionDate() == null || o.getOriginalActionDate() == null) {
            return -1;
        }
        return new SimpleDateFormat("MM/dd/yyyy").parse(
                getOriginalActionDate()).compareTo(
                new SimpleDateFormat("MM/dd/yyyy").parse(o
                        .getOriginalActionDate()));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return 0;
}

私がここでやっている間違いを教えてください。この点に関するポインタは非常に役立ちます。

ありがとう、
ゴパルラル

4

1 に答える 1

5

両方ともDateの場合、 の代わりにnull戻ります。0-1

実装者は、すべての x と y に対して sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) を保証する必要があります。(これは、y.compareTo(x) が例外をスローする場合、x.compareTo(y) が例外をスローする必要があることを意味します。)

投稿されたコードの場合、両方のオブジェクトの Date がnull

x.compareTo(y) == y.compareTo(x) == -1

そしてこれは契約に違反します。

メソッドを修正するには、iffor null チェックを次のように変更します。

if (getOriginalActionDate() == null && o.getOriginalActionDate() == null) {
    return 0;
} else if (getOriginalActionDate() == null) {
    return -1;
} else if (o.getOriginalActionDate() == null) {
    return 1;
}

したがって、両方が null の場合、戻り値は 0 (等しい) になります。それ以外の場合はnull、より小さいオブジェクトと見なされます。

于 2013-05-01T14:39:02.180 に答える