0

私は Java の初心者であり、try...catchステートメントを使用して例外を処理することを知っています。ブロックによって例外がスローされるtryと、catchブロックが実行されることを意味します。したがって、私の質問は、次のコードを ( なしで) 試したときに、報告されていないinメソッドが try catchスローされますが、使用する と正常に動作することです。IOExceptionread()try catch

上記の例外がtryブロックで発生して出力されたときに、制御が catch ステートメントに転送されないのはなぜexception occuredですか? ここに私のコードがあります:

class Test00 {
    public static void main(String args[]) {
        char ch;

        try {
            ch=(char)System.in.read();//here exception is thrown without using try..catch
            System.out.println(ch);
        } catch(Exception e) {
            System.out.print("exception occured");
        }
    }
}

コンパイラが例外をスローするように言っていると思いますが、それがコードが try catch で機能した理由です。しかし、catch ブロックが実行されないのはなぜですか?

4

3 に答える 3

8

コンパイラは、例外スローされる可能性があり、その可能性に対応する必要があることを通知しています。

コンパイラは、コードの静的分析を行っています。コードが実際にどのように実行されるかはわかりません。

これはイライラすることがあります。たとえば、次のように書いた場合:

new URL("http://www.stackoverflow.com");

コンパイラは、私がMalformedURLExceptionをキャッチすることを主張します。URL に問題がないことは明らかですが、以下URLを使用してオブジェクトを構築できるため、コンパイラは警告を表示します。

new URL(potentiallyDubiousUserInput);

その文字列がどうなるかは保証できませんpotentiallyDubiousUserInput

これらはチェック済み例外として知られており、それらを処理する必要があります (キャッチするか、さらにスローされるように宣言します)。それらは面倒な場合があり、Scala などの言語では、すべての例外がuncheckedであることがわかります。つまり、明示的に処理する必要はありません。

詳細については、この質問/回答を参照してください。

于 2013-07-04T16:12:59.780 に答える
1

コンパイラーが伝えていることと、実行時に何が起こっているかを区別する必要があります (そして、私たちがそれを理解する必要がないように、明確に伝える必要があります)。

あなたの場合、try-catch がなければ、コンパイラは がスローされるread() 可能性があり、何らかの方法で例外を処理する必要があることを伝えていました。これは、try-catch を追加することによって実行したことです。

ただし、その後プログラムを実行すると、実際にはスローされませんでした (一般的に言えば、このプログラムがスローする可能性はほとんどありません)。そのため、catch ブロックには入りませんでした。

于 2013-07-04T16:14:55.927 に答える
0

これはSystem.in.read()、チェック済み例外である IOException をスローできるためです。そして、JLS 11.2.3でチェックされた例外について述べたように:

E がチェック例外クラスであり、E がメソッドまたはコンストラクターの throws 句で宣言されたクラスのサブクラスではない場合に、メソッドまたはコンストラクター本体が例外クラス E をスローできる場合、コンパイル時エラーになります。

于 2013-07-04T16:44:28.597 に答える