2016-04-01 8 views
1

ich die folgenden Fehler bekommenVergleichsmethode seiner allgemeinen Vertrag verstößt auch nach null Überprüfung

Unable Aktivität wieder aufnehmen {com.xxx.yyy.zzz.HomeActivity}: java.lang.IllegalArgumentException: Vergleichsmethode gegen seine Generalvertrag!

Ich handle Null Fälle für die Zeichenfolge, auch wenn dieser Fehler kommt. Irgendwelche Hinweise darauf, was falsch sein könnte. Code unten

public class ConversationComparer implements Comparator<Conversation> { 
@Override 
public int compare(Conversation x, Conversation y) { 

    if (x.getLastMessageDate() == null) { 
     return 1; 
    } 

    if (y.getLastMessageDate() == null) { 
     return -1; 
    } 

    return y.getLastMessageDate().compareTo(x.getLastMessageDate()); 

}} 


public java.util.Date getLastMessageDate() { 
     return lastMessageDate; 
    } 

Dies ist, wie ich den Komparator verwenden

if (conversationListAdapter != null) { 
      Collections.sort(this.list,new ConversationComparer()); 
      conversationListAdapter.notifyDataSetChanged(); 
     } 

Antwort

1

Das einzige, was ich falsch das ist sehen kann damit Sie den Fall behandeln nicht korrekt ist, wo x.getLastMessageDate() und y.getLastMessageDate() beide null sind.

Ich denke, wenn Sie diese Zeile am Anfang der Methode hinzufügen, erfüllt es den Vertrag.

2

Sie sollten auch x und y erneut null und 0 zurückgeben, wenn beide null sind.

@Override 
public int compare(Conversation x, Conversation y) { 

    if (x == y || (x != null && y != null && x.getLastMessageDate() == y.getLastMessageDate())) 
     return 0;  

    if (x == null) 
     return 1; 

    if (y == null) 
     return -1; 

    if (x.getLastMessageDate() == null) 
     return 1; 

    if (y.getLastMessageDate() == null) 
     return -1; 

    return y.getLastMessageDate().compareTo(x.getLastMessageDate()); 
} 

Es wäre auch interessant zu wissen, welcher Datentyp "getLastMessageDate()" zurückgibt.

+0

getlastmessage ist java.util.Date – ila

+0

Dies ist nicht antisymmetrisch. Angenommen, 'x == null' und' y.getLastMessageDate() == null'. Dann vergleiche (x, y) == 1 und vergleiche (y, x) == 1 auch. –

+0

In diesem Fall glaube ich nicht, dass Ihre Ausnahme von der compareTo-Methode kommt. Date.compareTo wirft keine InvalidArgumentException. Vielleicht liefern Sie den gesamten Stack-Trace. – Till

Verwandte Themen