14

スローしようとしているときに、スローされたカスタム例外をtry/でラップする必要があるのはなぜですか?一般的な例外の場合はそうする必要はありませんか?catch例のように、私のExceptionサブクラス:

public class MyException extends Exception {
    public MyException(String msg) {
        super(msg);
    }
}

例外のスロー:

public class Exe {

    private static void testex(String test) {
        if (null!=test) {
            throw new UnsupportedAddressTypeException();
        } else {//Removing try/catch block results in compile failure
          try {
            throw new MyException("message");
          } catch (MyException e) {
            e.printStackTrace();
          }
        }
    }
}
4

4 に答える 4

17

UnsupportedAddressTypeException は RuntimeException のサブクラスであり、JavaDoc から:

RuntimeException は、Java 仮想マシンの通常の操作中にスローされる例外のスーパークラスです。

メソッドは、メソッドの実行中にスローされる可能性があるがキャッチされない可能性のある RuntimeException のサブクラスをその throws 句で宣言する必要はありません。

于 2012-05-13T20:24:05.047 に答える
12

例外が java.lang.Exception を拡張する場合は、それをキャッチ (または再スロー) する必要があります。java.lang.RuntimeException を拡張する場合は、そうする必要はありません。これは、すべての標準例外にも当てはまります。

edit単語を変更しましたmust not to not required to

于 2012-05-13T20:22:11.423 に答える
7

静的メソッドは宣言する必要があります

private static void testex(String test) throws MyException

メソッドにスローさせたい場合(内部でキャッチして処理したくない場合)。

于 2012-05-13T20:21:11.703 に答える
0

Javaチュートリアルから:

有効な Java プログラミング言語コードは、Catch または Specify 要件を遵守する必要があります。つまり、特定の例外をスローする可能性のあるコードは、次のいずれかで囲む必要があります。

  • 例外をキャッチする try ステートメント。例外のキャッチと処理で説明されているように、try は例外のハンドラーを提供する必要があります。

  • 例外をスローできることを指定するメソッド。メソッドは、メソッドによってスローされる例外の指定で説明されているように、例外をリストする throws 句を提供する必要があります。

Catch または Specify 要件を満たさないコードはコンパイルされません。すべての例外が Catch または Specify 要件の対象となるわけではありません。

[...]

実行時例外は、キャッチまたは指定要件の対象ではありません。ランタイム例外は、RuntimeException とそのサブクラスによって示されるものです。

于 2012-05-13T20:40:08.477 に答える