0

実行はHandledExceptionsをスローしないと言われています。JVMは単にそれらを無視します。そこで、UnHandled Exception(ArithmeticException)をスローしました。しかし、同じことが起こりました。XXXとマークされたcatch句によって開始されたスレッドからの例外をキャッチしようとするのはばかげていることを私は知っています。なぜなら、その言い訳はすでにその線を通過しているかもしれないからです。

しかし、JavaがHandled例外を制限しながらrunがUnhanlded Exceptionをスローすることを許可する理由と、run()がUnhandled Exceptionをスローするとさらに何が起こるのか知りたいですか?

親スレッド

public class Parent {

    public static void main(String[] args) {

        Child   child   = new Child();
        Thread chThread = new Thread(child);

        try {
            chThread.start();

        } catch (Exception e) { // XXX mark
            System.err.println("XXX");
            e.printStackTrace();
        }

    }

子スレッド

public class Child implements Runnable {

    @Override
    public void run() throws ArithmeticException{
            method0(); // line 8
    }

    public void method0(){
        int i = 0/0; // line 12
    }
}

java.lang.Thread

public class Thread implements Runnable {
    public void run() {
    if (target != null) {
        target.run(); // line 619
    }
    }
}

スタックトレース

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
    at seperateStacksPerThread.Child.method0(Child.java:12)
    at seperateStacksPerThread.Child.run(Child.java:8)
    at java.lang.Thread.run(Thread.java:619)
4

2 に答える 2

1

の署名にrun()は、チェックされた例外は含まれていません。その結果、チェックされた例外をスローするためにそれをオーバーライドすることはできません(overrideこれ以上制限することができない場合)。
ただし、チェックされていない例外をスローすることは許可されます。これは署名の一部ではないためです(誰もそれをキャッチする必要はありません)。算術例外をスローすると、それは別のスレッド
のスタックトレースの一部になります。 次のように表示されていることに注意してください。

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero

そしてではないException in thread "main" java.lang.ArithmeticException: / by zero

チェックされた例外が許可されないのはなぜですか。これは設計上の決定であり、スレッドは別の実行フローであるため、とにかく誰も例外をキャッチできないためだと思います。

于 2012-11-25T10:32:25.173 に答える
0

まず、すべてのメソッドがチェックされていない例外をスローする可能性があります。

次に、run()チェックされた例外をスローしない単純な理由は、それらをキャッチする人がいないことです。このメソッドは、開始されたスレッド内から「メイン」メソッドとして呼び出されます。これは、最上位のエントリポイントです。その上に例外を処理するものは何もないので、例外をスローするメソッドを宣言する意味はありません。

于 2012-11-25T10:44:41.423 に答える