7

Java には から拡張された Exception クラスがありますが、Exceptionそれをスローするたびに、コンパイラはそれをキャッチする必要がある/そのメソッドthrowsException を宣言する必要があると言います。

RuntimeExceptionから拡張された a を使用するとException、コンパイラは停止しません。それらを実行時例外として受け取るため、処理する必要はありません。

MyException を Exception から拡張し、それを実行時例外として保持する方法はありますか? またはクラスでこれを可能にするものは何ですかRuntimeException

private void compileTime() throws MyException{
        throw new MyException();
    }

    private void runTime() {
        throw new MyRuntimeException();
    }

    class MyException extends Exception {

    }
    class MyRuntimeException extends RuntimeException {

    }
4

4 に答える 4

11

RuntimeException は、回復可能な例外の未チェックの例外のサブセットです。

チェックされていない例外はコンパイル時にチェックされません。つまり、コンパイラーはメソッドでそれらをキャッチしたり (スローで) 指定したりする必要はありません。

チェック例外クラスは、RuntimeException クラスとそのサブクラス、および Error クラスとそのサブクラスです。他のすべての例外クラスはチェック例外クラスです。

この画像で例外階層を確認してください。 例外階層

つまり、"Exception" から派生したすべての例外はチェック済みの例外であり、RuntimeException から派生したクラスはチェックされていません。RuntimeExceptions は、呼び出し元のコードで明示的に処理する必要はありません。

于 2013-01-21T09:42:38.467 に答える
3

とんでもない。仕様によると、RuntimeExceptionクラスまたはErrorクラスから拡張された例外のみが未チェックの例外と見なされます (JLS 7、p. 11.1.1)。

于 2013-01-21T09:39:47.183 に答える
1

What you are calling a "compile-time" exception is known as a Checked exception. As you say the compiler will require you to include it in your method signature and your callers will need to handle the possibility that it may be thrown.

RuntimeException is explicitly intended for the "unchecked" exception case.

From the docs

A method is not required to declare in its throws clause any subclasses of RuntimeException that might be thrown during the execution of the method but not caught.

So just extend RuntimeException if you want an unchecked excption.

于 2013-01-21T09:42:12.673 に答える
0

RuntimeExceptionは、メソッドの先頭で try-catch コンボまたはスローを必要としません。10 要素の長い配列の 14 番目の要素を参照したり、何かの値を設定するのを忘れたために NullPointerException を取得したりするなど、実行時に発生するという理由だけで、プログラムは適切な構造でうまく機能するため、これらのケースは予測できません。また、他の人が言うように、これはチェックされていません。

例外は異なります。よく知られている例外ケースをどう処理するかをプログラムに指示する必要があります。つまり、コンパイラは、実行を開始する前に、例外を何らかの方法で処理することを強制します。

于 2013-01-21T11:47:38.357 に答える