1

私はこのコードを持っています:

public int Bol(int x, int y){
    if(x > y){
        return (x / y);
    }else if(x < y){
        return (y / x);
    }
}

「このメソッドは int 型の結果を返す必要があります」というエラーがスローされます。なぜそうしなければならないのですか?

この問題に変更else ifすると解決することを知っています。elseしかし、else-if を使用すると、なぜこのエラーが発生したのでしょうか?

4

6 に答える 6

3

いずれの条件も満たされない場合(つまり、の場合x == y)はどうなりますか?メソッドは何を返しますか?したがって、デフォルト値を返す必要があります。

public int Bol(int x, int y){
    if(x > y){
        return (x / y);
    }else if(x < y){
        return (y / x);
    }

    return 0; // or whatever default value you need
}

単一を使用することも役立ちますreturn

public int Bol(int x, int y){

    int result = 0; //whatever default value you want

    if(x > y) {
        result = (x / y);
    } else if(x < y) {
        result = (y / x);
    }

    return result;
}

「elseをelseに変更すると、この問題は解決することを知っています。しかし、else-ifを使用すると、なぜこのエラーが発生したのでしょうか?」

まず、ブランチがどのように機能するかを理解することは、正しく機能するコードを作成するために必要なコア知識であるため、、、およびの動作を確認するifことelseをお勧めします。else if

使用時に機能しない理由は、ブロックのブール式がtrueと評価された場合にのみ、ブロックelse if内のコードが実行されるためです。したがって、Javaコンパイラは、ブロックが実行されない場合があることを認識します(したがって、ブロックもブロックも実行されません)。つまり、どのステートメントも実行されない場合があります。これは、メソッドが常に。を返す​​というメソッドのシグネチャに違反します。これで、をに変更したときにコードが機能するようになりました。これは、前の(またはs)ブロックが実行されていない場合、 an内のコードが常に実行されるためです。else ifelse ififelse ifreturnintelse ifelseelseifelse if

于 2012-08-24T22:45:01.617 に答える
2

では、x == yの場合はどうなりますか?何を返しますか?

あなたのメソッドはintを返すように定義されました。しかし、x == yの場合、何も返されませんでした。

あなたは書くことができたでしょう

if (x > y) {
    return x/y;
} else if (x < y) {
    return y/x;
} else {
    return 1;  // x == y therefore x/y is 1.
}

また、xまたはyがzeorである場合にも注意してください。x=1およびy=0と言います。どうなると思いますか?

于 2012-08-24T22:44:35.143 に答える
1

コードが値を返さない場合があります。else ifまたは条件が満たされない場合はIE 。したがって、コンパイラはエラーにフラグを立てます。

elseの代わりにを使用する場合else if、コンパイラはどちらの場合も値を返すことを確認します。だから大丈夫です。

また、注意してください-「すべてのケースがカバーされている」というだけでは十分ではありません。たとえば、elseを変更した場合

else if ( x <= y ) {
....
}

次に、技術的にはすべてのケースがカバーされます(同時変更を除く)。それでも、コンパイラがそれを知るのは簡単ではなく、エラーのフラグを立てます。

コンパイラが戻り値があることを確認する唯一の方法は、aelseまたはif条件returnの外側です。

于 2012-08-24T22:45:36.927 に答える
0

現在、関数が何も返さない可能性があります。たとえば、x = yの場合、どちら(x > y)(x < y)真ではありません。関数には、x>yおよびy>xの場合にのみreturnステートメントが定義されているため、すべての場合に返されるわけではありません。

これを修正する1つの方法は、ifステートメントの後にデフォルトのreturnステートメントを追加することです。

public int Bol(int x, int y){
    if(x > y){
        return (x / y);
    }else if(x < y){
        return (y / x);
    }
    return 1;
}
于 2012-08-24T22:47:02.370 に答える
0

この時点で他のレスポンダーの誰も気付いていないのは、メソッドシグネチャがリターンタイプを要求しているということです。

public int Bol(int x, int y){

intpublicはリターンタイプを示します。Javaは強く型付けされた言語であるため、このメソッドからその型の何かを返す必要があります。で使用するelseif、他の条件でキャッチされないすべてのケースがキャッチされます。

public int Bol(int x, int y){
    if(x > y){
        return (x / y);//returns a double, which can be cast to an int
    }else if(x < y){
        return (y / x); //returns a double, which can be cast to an int
    }
}    //if this line is reached, nothing is being returned, so the compiler throws an error.
于 2012-08-24T22:47:11.573 に答える
0

コードロジックを理解します。両方のif条件が満たされない場合がありますか?はい、それは可能であり(つまり、の場合x==y)、その状況では関数は何も返しません。その条件のために、関数にデフォルトの戻り値を設定する必要がありますが、それを見逃していて、コンパイラーが文句を言っています。

于 2012-08-24T22:47:54.477 に答える