2013-03-08 11 views
5

Ich lerne grundlegende Java jetzt und habe ein Problem mit meinem Code, dass ich nicht herausfinden kann. Es ist im Grunde, was der Titel sagt. Mein Java-Compiler sagt mir, dass es ein Fehler mit meiner benutzerdefinierten compareTo-Methode, sagen, dass es ein int zurückgeben muss. Das Problem ist, soweit ich das beurteilen kann, es gibt einen int zurück. Trotzdem gibt es mir immer noch einen Fehler. Könnte jemand bitte in meinem Code darauf hinweisen, was falsch ist? Und ich habe auch Vergleichbares in meiner Klasse implementiert. Hier ist meine Methode:Java - Modifizierte compareTo Methode sagt, es muss eine int zurückgeben, aber es sollte eine zurückgeben

public int compareTo(Homework other) { 
    if (getDaysLate() < other.getDaysLate()) { 
     return -1; 
    } else if ((dateSubmitted == other.dateSubmitted) 
      && (files.compareTo(other.files) == -1)) { 
     return -1; 
    } else if ((dateSubmitted == other.dateSubmitted) 
      && (files == other.files)) { 
     if (name.compareTo(other.name) == -1) { 
      return -1; 
     } else if (name.compareTo(other.name) == 1) { 
      return 1; 
     } else if (name.compareTo(other.name) == 0) { 
      return 0; 
     } 
    } else { 
     return 0; 
    } 
} 

Antwort

1

Sie vermissen einen anderen nach diesem Zweig:

else if (name.compareTo(other.name) == 0) { 
    return 0; 
} 

Wenn der Test fehlschlägt (compareTo nicht 0 zurück) das Verfahren ohne einen Rückgabewert verlassen müßte, was in Java illegal ist.

Außerdem kann compareTo einen beliebigen ganzzahligen Wert zurückgeben, nicht nur 0, 1 und -1.

2

Es gibt einen Pfad in der dritten else, der nichts zurückgibt.

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
    if (name.compareTo(other.name) == -1) { 
     return -1; 
    } 
    else if (name.compareTo(other.name) == 1) { 
     return 1; 
    } 
    else if (name.compareTo(other.name) == 0) { 
     return 0; 
    } else return ... 
} 

BTW, ich bin nicht sicher, ob ich die Logik Ihrer Implementierung folgende bin, da es scheint, dass Sie 0, wenn dateSubmitted != other.dateSubmitted zurückkehren. compareTo sollte auch anti-symetric (d sgn(x.compareTo(y)) == -sgn(y.compareTo(x))) sein, aber Ihre Implementierung ist es nicht.

+0

@TedHopp Richtig (danke, behoben). Ich korrigierte auch, dass antisymmetry nur für den ** Zeichen erforderlich ist ** des Ergebnisses (beide Null sind, oder eine positiv und die andere negativ ist). Der absolute Wert spielt keine Rolle. – Javier

1

Wie können Sie sicher sein (mit all diesen if und anderen), dass Sie immer ein int zurückgeben? Es ist nicht so offensichtlich für mich scheinen und aparently der Compiler stimmt mir zu.

Eine Möglichkeit, dies zu lösen (wahrscheinlich nicht die beste), ist das Hinzufügen einer return -1; //or whatever value am Ende Ihrer Funktion.

1

In Ihrer zweiten else-if-Anweisung haben Sie einen Codepfad, der möglicherweise nichts zurückgibt. Sie sagen:

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
    if (name.compareTo(other.name) == -1) { 
     return -1; 
    } 
    else if (name.compareTo(other.name) == 1) { 
     return 1; 
    } 
    else if (name.compareTo(other.name) == 0) { 
     return 0; 
    }  

, aber was ist, wenn keiner von denen sonst, wenn's wahr ist? Versuchen Sie, die letzte else-if in Ihrer zweiten else-if-Anweisung in else zu ändern.

0

Das Verfahren sollte geeigneten Wert zurück auf allen Codeströmungsweg; mit anderen Worten, bei allen Bedingungen, wenn die Methode zurückkehrt. Im folgenden if Block zurückgibt es nicht auf einem Weg, den ich markiert habe.

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
     if (name.compareTo(other.name) == -1) { 
     return -1; 
     } 
     else if (name.compareTo(other.name) == 1) { 
     return 1; 
     } 
     else if (name.compareTo(other.name) == 0) { 
     return 0; 
     } 
     // It should return something here, if none of the above "if" statements match. 
     // Or one of the above "else if" should be changed to "else" 
    } 
Verwandte Themen