3

次のコードを実行しているとき

1.    public class test {
2.      public static void main(String[] args) {
3.          try {
4.              int i = 10 / 0;
5.          } catch (Exception e) {
6.              int j = 10 / 0;
7.          } finally {
8.              int k = 10 / 0;
9.          }
10.     }
11.    }

エラーが発生します:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at test.main(test.java:8)

JVM が catch ブロックではなく main() から例外をスローする理由がわかりません。

4

6 に答える 6

2

JLS の try-catch-finally の段階的な説明に従うと、(要約すると) catch が例外をスローした場合に finally が実行され、(私の強調は強調) が実行されることがわかります。

R の理由で catch ブロックが突然終了した場合は、finally ブロックが実行されます。

finally ブロックが理由 Sで突然終了した場合、try ステートメントは理由 S で突然終了します(理由 R は破棄されます)。

そのため、catch ブロックによってスローされた例外 (finally ブロックの前に実行される) は破棄され、報告される例外は、finally ブロックでスローされたものです。

于 2013-07-31T10:25:31.560 に答える
1

注目すべき興味深い点の 1 つは、finallyステートメント内のコードにコメントを付けると、ArithmeticExceptionスローされた がステートメント内のコードに関係することcatchです。

ここで起こっていることはあなたのステートメントExceptionでスローされる必要があるが、あなたのステートメントでスローされる必要があるということだと思います。catchExceptionfinally

于 2013-07-31T10:25:09.887 に答える
1

例外

in  } catch (Exception e) {
              int j = 10 / 0;
             }

finally ブロックにスローされます。finally ブロックを削除すると、

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at test.main(test.java:6)

catch ブロックのすべての例外は、finally ブロックにもスローされ、finally ブロックも何らかの方法で実行されます

于 2013-07-31T10:34:36.037 に答える
1

すべてのブロック - try/catch/finally でゼロによる除算があるためです。catch 内に別の try-catch ブロックを追加し、catch でエラーを報告します。

例えば:

public class test {
    public static void main(String[] args) {
        try {
            int i = 10 / 0;
        } catch (Exception e) {
            try {
                int j = 10 / 0;
            } catch (Exception e) {
                // report an error here - do not do any business logic
            }
        } finally {
            int k = 10 / 0;
        }
    }
}
于 2013-07-31T10:22:19.950 に答える