Java-Fehler: "Die Vergleichsmethode verletzt ihren allgemeinen Vertrag!"

8

Ich habe diesen Code:

%Vor%

Und jedes Mal, wenn ich diesen Code ausführe, erhalte ich folgende Fehlermeldung:

%Vor%

Ich verwende OpenJDK7u3 und gebe 0 zurück, wenn die Objekte gleich sind. Kann mir jemand diesen Fehler erklären?

    
mariolpantunes 27.02.2012, 17:23
quelle

3 Antworten

8

Sie könnten in diese Situation kommen, wenn Sie irgendwelche NaN-Werte haben:

Zum Beispiel:

%Vor%

Alle dieser print false . Sie könnten also in eine Situation geraten, in der zwei Nicht-NaN-Werte beide als "gleich" zu NaN angesehen wurden, aber einer größer war als der andere. Grundsätzlich sollten Sie herausfinden, wie Sie mit NaN-Werten umgehen wollen. Überprüfen Sie auch, dass das wirklich das Problem ist, natürlich ... wollen Sie wirklich NaN-Werte für Ihre Fitness?

    
Jon Skeet 27.02.2012, 17:29
quelle
4

Wahrscheinlich ist Ihre Fitnessfunktion auf zwei Arten kaputt:

  1. Es wird nicht immer derselbe Wert zurückgegeben, wenn es für dasselbe Objekt aufgerufen wird.
  2. Es könnte NaNs zurückgeben. Ihr compareTo() ist in Gegenwart von NaNs nicht transitiv, wie von Jon Skeet erklärt.

Sie könnten Ihre Vergleichsfunktion mit Double.compare() neu schreiben:

%Vor%

Dies erfordert weniger Code und kümmert sich um Eckfälle (NaNs, die negative Null usw.). Natürlich, ob diese Eckfälle in erster Linie entstehen sollten, ist für Sie zu entscheiden und zu adressieren.

    
NPE 27.02.2012 17:38
quelle
0

Sie sollten versuchen, if (this == o) return 0; hinzuzufügen. Weil das gleiche Objekt gleich zurückgegeben werden muss.

    
Michael Laffargue 27.02.2012 17:27
quelle

Tags und Links