2

このコードに関して質問があります。例外に関係します。

public class MTest {
    public static void main(String args[]) {
        try {
            m1();
            m2();
        } catch (Exception e1) {
            System.out.println("e");
        }
    }

    static void m1() throws Exception {
        try {
            throw new Exception();
        } catch (Exception e2) {
            System.out.println("m1catch");
        }
    }

    static void m2() throws Exception {
        try {
            throw new Exception();
        } finally {
            System.out.println("Finally");
        }       
    }
}

したがって、上記のコードによると、教科書には、m2()メソッドはそれ自体の例外を処理せず、mainに渡されると書かれています。どういう意味ですか?そして、上記のコードからどのように見分けることができますか?m1()独自の例外を処理しますか?

4

3 に答える 3

1

メソッド内でスローできるチェック済みの例外は、try / catchブロックで処理するか、その例外をスローするようにメソッドを宣言する必要があります。これらのルールに違反するコードをコンパイルしようとすると、Javaコンパイラは文句を言います。

m1()チェックされた唯一の例外をキャッチするため、独自の例外を処理します。throws Exceptionの宣言から削除するm1()と、正しくコンパイルされます。これは、チェックされたすべての例外を処理することを意味します。

m2()その例外を処理しません。throws Exceptionの宣言から削除するm2()と、例外がスローされたがキャッチまたはチェックされていないため、コンパイルエラーが発生します。

于 2012-10-23T23:54:51.113 に答える
1

この場合、m1はそれ自体の例外を処理し、m2は例外をmainに渡すか「スロー」します。これは、m1関数にあるcatchステートメントが原因です。基本的に、tryブロックからスローされた例外は、この例外が(コード内の)tryの一部として処理される場合、最初に検索されます。

catch (Exception e2){ System.out.println("m1catch"); }

m2のようにcatchブロックがない場合、関数は、おそらくm2を呼び出す関数によって、例外がより高い位置で処理されると想定します。main()がm2 thisを呼び出したので、それはすぐ次に見る場所であり、そこでcatchブロックが例外を処理します。

于 2012-10-23T23:59:40.657 に答える
0

m1()try{}とを使用して例外を処理しますcatch。スローされた例外はcatchblock ()でキャッチされます。

throws Exceptionが削除されても、コンパイラーは例外をスローしません。

m2()例外をキャッチしません。try{}例外をスローするためにブロックのみが使用されます。例外はメソッド内で処理されません。mainメソッドにスローするように設定されています。mainメソッドでのみ、例外がキャッチされます。throws Exceptionがから削除されるm2()と、コンパイラは「報告されていない例外をスローします。キャッチするか、スローするように宣言する必要があります」

于 2014-07-09T13:30:47.667 に答える