2

私は現在Javaの入門コースを受講していますが、これはtry-catchメソッドに関するものです。これを入力すると、System.out.printlnステートメントが際限なく繰り返されます。これが私のコードです:

public static double exp(double b, int c) {
    if (c == 0) {
        return 1;
    }

    // c > 0
    if (c % 2 == 0) {
        return exp(b*b, c / 2);
    }
    if (c<0){
        try{
        throw new ArithmeticException();
        }
        catch (ArithmeticException e) {
            System.out.println("yadonegoofed");
        }
    }

    // c is odd and > 0
    return b * exp(b, c-1);
}
4

5 に答える 5

3
if (c<0){
    try{
    throw new ArithmeticException();
    }
    catch (ArithmeticException e) {
        System.out.println("yadonegoofed");
    }
}

// c is odd and > 0
return b * exp(b, c-1);

あなたのコメントc is odd and > 0は正しくありません。実際に関数を例外で終了したことはありません。あなたはそれを投げ、すぐにそれをキャッチし、再帰関数を実行し続けました。最終的に、wraparoundを押すと、再び正の数になり、エラーは発生しなくなります。(約 20 億回の反復が必要です。待つ必要はありません。)

ここでは例外を使用しません。再帰を終了する必要があるだけです。をチェックする前に負の入力をチェックし0、そこで例外をスローし、呼び出し元で例外をキャッチします

擬似コード:

exp(double b, int c) {
    if (c < 0)
        throw new Exception("C cannot be negative");
    } else if (c % 2 == 0) {
        return exp(b*b, c / 2);
    } else {
        /* and so forth */
    }
}
于 2012-04-13T00:57:33.633 に答える
2

独自のカスタム例外を作成する際に、非常に重要な部分を 1 つ忘れていました。そのようなメソッドをスローすることをメソッドに伝えるのを忘れました。コードの最初の行は次のようになります。

public static double exp(double b, int c) throws ArithmeticException {

私はこれを自分でテストしたことに注意してください。出力で例外がスローされるのは1回だけです。

于 2012-04-13T01:05:37.020 に答える
1

たとえば、c = -1 in の場合、1 番目と 2 番目の if が失敗し、3 番目の if が例外をスローしてからエラーを出力しますが、例外を処理したため、事態は進行します。したがって、exp(b, -2) を呼び出します。次に、リターンで exp(b, -3) を呼び出します。C の値を println に追加して確認します。

于 2012-04-13T00:57:27.017 に答える
0

さて、最後にreturn b * exp(b, c-1);これがexp再び呼び出され、それが再び呼び出されます。
したがって、関数は繰り返され続け、そうなり System.out.printlnます。

于 2012-04-13T00:55:57.693 に答える
0

あなたのBASEケースは非常に具体的です...コードでcが0になることを保証するものは何ですか? 現在、これが再帰呼び出しを終了する唯一の方法です。@Jayが言ったように、例外がスローされる原因となる常に1を減算しますが、cはその時点ですでに0未満であるため、EQUAL 0ではありません。最初のifステートメントを値<= 0をキャッチするように変更すると、問題ありません。

if( c <= 0 )
     return 1;
于 2012-04-13T00:59:11.313 に答える