0

私はJavaから始めています。数値が素数であるかどうかを識別する方法を書いているときに、このようなメソッドを書きました

public static boolean checkPrime(int n){

    int x = 2;

    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }

    if(((n % x) == 0) && (n == x)){     
        return !Prime;
    }
    else if(((n % x) == 0) && (n > x)){
        return Prime;
    }
    else {
        return Prime;
    }
}

私が理解できなかったのは、最後のelseステートメントの必要性です。入れないとエラーメッセージが出ます。ただし、すべての可能性が以前のループでカバーされており、return ステートメントが尊重されているため、必要ではないと思います。または、何か不足していますか?

4

6 に答える 6

2

それ以外は必要ありません。コンパイラから言われているのは、メソッドが何かを返さなければならないということです。最後のelseブロックは次のように置き換えることができます:

return PrimeOrNot;

実際、メソッドは次のようになります。

public static boolean checkPrime(int n){
    int x = 2;
    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }
    if(((n % x) == 0) && (n == x)){     
        return !(PrimeOrNot);
    }
    return (PrimeOrNot);
}

いずれにしても、最後のステートメント ブロックを . にすることはできませelse if

于 2013-06-08T02:31:57.283 に答える
1

if/else-if 内の条件式は、実行時にのみ評価されます。通常、コンパイラはコンパイル時に評価されないため、結果がどうなるかわかりません。唯一、コンパイラが式の結果がどうなるかを理解できる状況は、それがコンパイル時の定数(のようなif(true) {)である場合です。

于 2013-06-08T02:38:58.567 に答える
1

メソッドの戻り値の型は boolean です。

コンパイラは、「if」ケースがどれも満たされない可能性に怯えています。この状況では、メソッドは何を返すかを知っています。このメソッドは何かを返す必要があるため、メソッドが終了する前に「return true」を指定してください。読み込まれることはありませんが、コンパイラを満足させます。

于 2013-06-08T02:34:10.643 に答える
0

値を返すメソッドは、可能なすべてのコード パスで値を返す場合にコンパイル可能になります。

あなたがコンパイラーだと想像してみてください。次のコードが表示されます。

int myMethod()
{
    if (cond)
        return anInt;
}

実際には常に真であることを知っているかもしれませんが、コンパイラーはそれを知りません。コンパイル時にのみ評価できる式である場合にのみ、ブール式の結果について確認できます。cond

Java における「コードの最適化」の大部分は、実際には実行時に行われることに注意してください (JIT: ジャスト イン タイム)。

于 2013-06-08T02:47:13.100 に答える
0

コンパイラは、メソッドからの有効なリターン パスがあるかどうかのみをチェックします。コンパイラは、条件ステートメントを検査し、条件が論理的に満たされるかどうかを判断するほど「スマート」ではありません。コンパイラは、メソッド宣言のコントラクトを尊重するために、何らかの値が返されることを確認するだけです。

以下はメソッドのよりクリーンな構造であると主張する人もいます (しかし、それは単なる好みの問題だと思います)。

public static boolean checkPrime(int n){
    int x = 2;
    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }

    if(((n % x) == 0) && (n == x)){     
        return !(PrimeOrNot);
    }

    return (PrimeOrNot);
}
于 2013-06-08T02:35:56.970 に答える
0
public static boolean checkPrime(int n){
    boolean PrimeOrNot = false;
    int x = 2;

    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }

    if(((n % x) == 0) && (n == x)){     
        return !(PrimeOrNot);
    }
    else if(((n % x) == 0) && (n > x)){
        return (PrimeOrNot);
    }

    return PrimeOrNot;
}
于 2013-06-08T02:34:35.067 に答える