6

Java 仕様では、例外がスローされた場合、それを try/catch ステートメントで処理するか、関数を "throws XYZException" で宣言する必要があります。これには RuntimeException の例外があり、キャッチされずにスローされても問題ありません。

これは意見の問題のように聞こえるかもしれませんが、考えれば考えるほど直感に反するように思えます。

例外を拡張する RuntimeException があるのはなぜですか?

私が最初に Java を始めたとき、すべての例外をそのようにキャッチする必要があると考えていました。すべての例外が Exception を拡張するため、それは理にかなっています。RuntimeException 例外例外 :P を持つことは、OOP の違反のようです。RuntimeException はスローをやや冗長にするので、なぜ Java はそもそも実行時にすべての例外を許可せず、呼び出し元にそのタイプの例外を強制的に処理させたい場合にのみスローを追加したのでしょうか?

例:

void noThrows() {
    throw new Exception();
}

...エラーはありません。

void hasThrows() throws AnyBaseOfXYZException {
    throw new XYZException();
}

...エラーはありません。

void testFunction() {
    hasThrows();
}

...「hasThrows」が AnyBaseOfXYZException をスローするため失敗し、これは処理されません

void testFunction() {
    try {
        hasThrows();
    } catch (AnyBaseOfXYZException e) {
        ...
    }
}

...エラーはありません。

Exception を拡張するある種の "CompileTimeException" を考えたことがありますが、よく考えてみると、RuntimeException ほど醜くなければ機能しません。

基本的に、Java はthrows、RuntimeExceptions を除いてすべての例外を強制的に強制することを決定したのはなぜthrowsですか?

4

3 に答える 3

9

まず、スローできるすべてのものの基底クラスはThrowable(not Exception) です。

Throwableには、 と の 2 つのサブクラスがExceptionありErrorます。

ExceptionRuntimeExceptionです。

これら 4 つの主要なクラスのうち、RuntimeExceptionErrorチェックされていません (スローされると宣言しなくてもスローされる可能性があります)。

RuntimeExceptionチェックされていないことの背後にある考え方は、通常はプログラミングエラーであり、通常のグッド プラクティスではそれらを回避する必要があり (たとえばArrayIndexOutOfBoundsException、 またはNullPointerException)、それらをキャッチする必要があるとコードが大量に乱雑になるということです。

チェックされていない理由Errorsは、基本的に、何かが起こった場合にできることは何もないためですOutOfMemoryError

つまり、他のすべての Throwables、つまり のサブクラスはException、スローまたはキャッチとして宣言する必要があります。この背後にある考え方は、チェックされた例外を「呼び出し元が処理」できるということです。例FileNotFoundException(私たちはこれが何を意味するかを知っており、取得した場合に何をすべきかを知っておく必要があります)。

Java 設計者は、常にこれを正しく理解しているわけではありません。SQLExceptionがチェックされていますが、回復する現実的な方法はありません。クエリに構文エラーがありますか? データベースが接続を拒否していますか? 誰が知っていますが、私はそれを「処理」できないことを知っています.

于 2013-07-13T13:17:29.297 に答える
0

場合によっては、catchすべての例外 (checked と unchecked) をキャッチする が必要になることがあります。Java の設計上の決定により、catch (Exception e) { ... } 未チェックの例外 (RuntimeException を拡張する例外) が拡張されていない場合は、2 つの句Exceptionを使用する必要がありました。catch

于 2013-07-13T13:06:32.547 に答える
0

これは、チェックおよびチェック解除の例外のトピックに関連している可能性があります。RuntimeException から

RuntimeException and its subclasses are unchecked exceptions. Unchecked exceptions 
do not need to be declared in a method or constructor's throws clause if they can 
be thrown by the execution of the method or constructor and propagate outside the
method or constructor boundary.

チェック例外は、プログラム実行時に回復可能な場合に使用します。したがって、クラスを作成するプログラマーにメソッド定義でクラスを宣言させることは完全に理にかなっています。そうすることで、コーラーは強制的にそれをキャッチするか、再スローします。

ただし、アンチェック例外は回復不能なケースのためのものであるため、終了することをお勧めします。このケースはめったに発生しません (通常、コードがまだ開発されているときに発生します)。したがって、これは通常、プログラマーのエラーまたは非常に致命的なバグを示しており、通常はクラスの作成者が修正する必要があり、クラスのクライアントが回復することはできません。

于 2013-07-13T13:10:35.340 に答える