0

これが私のコードです:

class FinallyDemo {
    static void myMethod(int n) throws Exception{
        try {
            switch(n) {
                case 1: 
                    System.out.println("1st case");
                    return;
                case 3: 
                    System.out.println("3rd case");
                    throw new RuntimeException("3!");
                case 4: 
                    System.out.println("4th case");
                    throw new Exception("4!");
                case 2: 
                    System.out.println("2nd case");
            }
        catch (RuntimeException e) {
            System.out.print("RuntimeException: ");
            System.out.println(e.getMessage());
        } finally {
            System.out.println("try-block entered.");
        }
    }

    public static void main(String args[]){
        for (int i=1; i<=4; i++) {
            try {
                FinallyDemo.myMethod(i);
            } catch (Exception e){
                System.out.print("Exception caught: ");
                System.out.println(e.getMessage());
            }
            System.out.println();
        }
    }
}

さて、それはこのように機能しません:

メソッド自体に try と catch ブロックがある場合は、記述する必要はありません

method_name(int n) throws Exception?

例外をスローするメソッドで try-catch ブロックを使用すると、例外をスローするメソッドで「例外をスローする」と記述できなくなりますか?

4

7 に答える 7

3

あなたの例では、ケース4は例外をスローしますが、キャッチではRuntimeExceptionをキャッチしているだけです。Exception には catch がないため、メソッドは Exception をスローすることを宣言する必要があります。Exception の catch を追加する場合は、Exception をスローする必要はありません。これは機能します。

static void myMethod(int n) {
    try {
        switch (n) {
            case 1:
                System.out.println("1st case");
                return;
            case 3:
                System.out.println("3rd case");
                throw new RuntimeException("3!");
            case 4:
                System.out.println("4th case");
                throw new Exception("4!");
            case 2:
                System.out.println("2nd case");
        }
    } catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
    } catch (Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
    } 
    finally {
        System.out.println("try-block entered.");
    }
}
于 2011-10-17T04:52:44.270 に答える
1

throwsスローされる例外のタイプがキャッチされる場合 (またはそれが extends の場合) に限り、句は必要ありませんRuntimeException。あなたの場合、Exceptionステートメントthrow new Exception("4!");で an をスローしますが、 type のみをキャッチしますRuntimeException

の catch ブロックを追加すると、句Exceptionは不要になります。throws例えば:

static void myMethod(int n) throws Exception{
    try {
        switch(n) {
        case 1: 
            System.out.println("1st case");
            return;
        case 3: 
            System.out.println("3rd case");
            throw new RuntimeException("3!");
        case 4: 
            System.out.println("4th case");
            throw new Exception("4!");
        case 2: 
            System.out.println("2nd case");
        }
    } catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
    } catch(Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
    } finally {
        System.out.println("try-block entered.");
    }
}
于 2011-10-17T04:51:13.423 に答える
1

はい、メソッドによってスローされる可能性のあるすべての例外の種類をキャッチしている場合に限ります。

コードでは、 をスローしますが、そのExceptionためのブロックを提供しませんcatch(キャッチするだけですRuntimeException)。したがって、メソッドをスローとして宣言する必要があります。Exception

次のものが必要です。

 ...
 catch (RuntimeException e) {
     System.out.print("RuntimeException: ");
     System.out.println(e.getMessage());
 } catch (Exception e) {
     System.out.print("Exception: ");
     System.out.println(e.getMessage());
 } finally {
 ...
于 2011-10-17T04:51:22.157 に答える
0

2 つの方法で例外を処理しています。まず、メソッドを宣言するときに行ったように、例外クラスを直接呼び出す場合

method_name(int n) throws Exception

これが意味することは、メソッドで発生した例外の種類に関係なく、常にキャッチできるということです。たとえば、算術例外または NullPointerException または ArrayIndexOutOfBoundsException がメソッド内で発生した場合、上記の宣言はそれぞれをキャッチでき、それらのすべて。そのため、RunTimeException でさえ例外クラス階層の一部であるため、try catch ブロックをそのメソッド内に配置する実際の目的はありません。したがって、あなたの質問を正しく理解した場合、プログラムは実行され、catch ブロックから例外をキャッチしますが、失敗するとメソッド宣言から例外がキャッチされます。それがあなたの質問に答えることを願っています。

于 2011-10-17T04:58:07.473 に答える
0

例外をスローするメソッドで try-catch ブロックを使用すると、例外をスローするメソッドで「例外をスローする」と記述できなくなりますか?

いいえ、そうでない場合でも、いつでも例外をスローするように宣言できます。

とりわけ、これはサブクラスがそれらをスローできるようにするのに役立ちます (追加の throw 句を追加することは許可されていないため)。また、後で例外インターフェイスを変更せずに実装を変更することもできます。

于 2011-10-17T04:53:21.977 に答える
0

現在、2 種類の例外があります

  1. 例外のサブクラス。
  2. RuntimeException のサブクラス

Exception のサブクラスはチェック済み例外として認識されており、コンパイラはこれらが try/catch ブロックで、または修飾子throws Exception (またはサブクラス) を介してメソッドで確実に管理されるようにします。

RuntimeException のサブクラスは未チェックの例外として知られており、コンパイルはそれを管理するためのメカニズムを必要としません。

メソッドで修飾子throws Exception (またはサブクラス) を使用すると、コンパイラは try/catch でそれを管理する必要があります。

于 2011-10-17T04:53:35.683 に答える
0

スイッチでaRuntimeExceptionと an の両方をスローするため、メソッド呼び出しで処理できるようにException、両方をキャッチするか、メソッドが をスローする必要があります。ExceptionmyMethod

両方をキャッチするには:

catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
}catch (Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
}

Exceptionのキャッチが常に最後であることを確認してくださいRuntimeExceptionException

于 2011-10-17T04:54:24.817 に答える