1

どうすればこれを機能させることができますか? returnステートメントを追加する必要があると書かれていますが、1つあります。

public boolean clockFactCheck(int a, int b){
    for (int i = 0; i <= 276; i++){
        for (int h = 0; h <= 55; h++){
            if (a == i + 186 && b == h + 133){
                return true;
            } else {
                return false;
            }
        }
    }
}
4

6 に答える 6

3

提供されたコードはreturn、どの入力に対しても の1 つに到達しない可能性がありa,b、それがコンパイラーの不満です。

実際、あなたの場合、if-else最初の反復で到達します-残念ながら、コンパイラーが推測できないものです。したがって、保存方法に進み、このエラーが発生します。

コメント:したがって、ループはまったく反復されず、最初の反復内で停止するため、あまり意味がないように思われi==0ますh==0。そのようなコードを書くつもりでしたか?

于 2013-01-25T12:12:06.160 に答える
0

for ループの後に return ステートメントはありませんが、それでも h++ は最初の反復を通過しないため、デッド コードです。

于 2013-01-25T12:11:47.407 に答える
0

すみません、これはばかげた質問でした。これを投稿したのは午前 5 時でした。私は自分の問題に対する答えを見つけました。あなたが私と同じ愚かな間違いを犯した場合、ここに修正があります

public boolean clockFactCheck(int a, int b){
    for (int i = 0; i <= 276; i++){
        for (int h = 0; h <= 55; h++){
            if (a == i + 186 && b == h + 133){
                return true;
            }
        }
    }
    return false;
}
于 2013-01-25T20:43:07.260 に答える
0

私の推測では、コンパイラは、ループの周りにコードパスがないことを理解するほど賢くありません。

これが実際のコードである場合は、単純化して次のようにします。

return (a == 186 && b == 133);

これが実際のコードでない場合は、返されない別のパスが存在する可能性があります (貼り付けでエラーが発生した場合)。または、実際にはコンパイラのバグまたは制限があります。ある時点で、停止の問題に悩まされ、コードが複雑すぎてコンパイラーが理解できなくなります。

後者の場合、私は

throw new RuntimeException(
   String.format("should never get here (a = %d, b = %d) !",a,b));

最後の発言で。

これにより、コンパイラが満足するだけでなく、決して発生してはならない場合、または発生したとしても考えられなかった場合に「未定義」の戻り値が導入されることもありません。

于 2013-01-25T12:17:16.870 に答える
0

return ステートメントをループの外側に配置します。(関数でブール値を宣言し、それを変更して最後に返します)

于 2013-01-25T12:13:14.460 に答える
0

Java では、すべてのパスが値を返す必要があります。コンパイラは、循環がパスを返すかどうかを判断できませんでした。コードが次のような場合:

public boolean add(){
for(int i=0;i<100;i++)
    if(i==5000)
    return true;}

関数 add は値を返しません。代わりに、エラーが発生します。

于 2013-01-25T12:41:59.773 に答える