5

私は今、基本的なJavaを学んでいて、コードに問題があり、理解できません。それは基本的にタイトルが言うことです。私のJavaコンパイラは、カスタムのcompareToメソッドにエラーがあり、intを返す必要があると言っています。問題は、私が知る限り、intを返すことです。それでも、それでもエラーが発生します。誰かが私のコードで何が問題なのか指摘してもらえますか?また、クラスにはすでにComparableを実装しています。これが私の方法です:

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;
    }
}
4

5 に答える 5

2

else何も返さない3 番目のパスがあります。

 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 ...
}

ところで、あなたの実装のロジックに従っているかどうかはわかりませんdateSubmitted != other.dateSubmittedcompareToまた、反対称 (つまりsgn(x.compareTo(y)) == -sgn(y.compareTo(x))) である必要がありますが、実装はそうではありません。

于 2013-03-08T06:41:26.923 に答える
1

このブランチの後にelseがありません:

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

テストが失敗した ( compareTo0 を返さない) 場合、メソッドは戻り値なしで終了する必要がありますが、これは Java では違法です。

また、compareTo0、1、および -1 だけでなく、任意の整数値を返す場合があります。

于 2013-03-08T06:41:17.580 に答える
1

常に int を返していることを (これらすべての if と else で) どのように確認できますか? 私にはそれほど明白ではないように思われ、コンパイラも私に同意しているようです。

これを解決する 1 つの方法 (おそらく最善の方法ではありません) はreturn -1; //or whatever value、関数の最後に a を追加することです。

于 2013-03-08T06:43:21.813 に答える
1

2 番目の else-if ステートメントには、何も返さないコード パスがあります。あなたは言う:

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;  
    }    

、しかし、これらの if がどれも true でない場合はどうなるでしょうか? 2 番目の else-if ステートメントの最後の else-if を else に変更してみてください。

于 2013-03-08T06:44:05.933 に答える
0

メソッドは、すべてのコード フロー パスで適切な値を返す必要があります。つまり、メソッドが返されるすべての条件で。次のifブロックでは、マークした 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;
        }
        // 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"
    }
于 2013-03-08T06:44:07.957 に答える