技術的には、実際には「回復不能エラー」と「回復可能エラー」を区別するのではなく、チェックされた例外とチェックされていない例外を区別します。Javaは次のようにそれらを区別します。
- 句でチェック例外を宣言する必要があります。ブロックで
throws
チェック済み例外をスローするメソッドを使用する場合は、例外を指定するか、この例外をメソッドの句に追加する必要があります。try
catch
throws
- 句で未チェックの例外を宣言できます (推奨されません) 。ブロックで
throws
チェックされていない例外をスローするメソッドを使用している場合は、その例外をスローするか、この例外をメソッドの句に追加することができます (いずれも推奨されません)。try
catch
throws
自分が何をしているのか本当によくわかっていない限り、どのような種類のチェックされていない例外 (つまり、catch
空のブロックで例外を飲み込む) もお勧めできません。
Exception
基本チェック例外クラスです。Error
とRuntimeException
は両方とも未チェックの例外であり、それらのすべてのサブクラスもそうです。Throwable
3 つのクラスはすべて extendsであり、javadoc には次のようにThrowable
記載されていることに注意してください。
コンパイル時の例外チェックのために、Throwable と、RuntimeException または Error のサブクラスではない Throwable のサブクラスは、チェック済み例外と見なされます。
(悪名高い) 有名な非チェック例外の古典的な例:
OutOfMemoryError
(拡張Error
);
StackOverflowError
(拡張Error
);
NullPointerException
(拡張RuntimeException
);
IllegalArgumentException
(拡張RuntimeException
);
- などなど
と の唯一の実際の違いはError
、RuntimeException
推定される重大度レベルであり、技術的な違いではなく「意味論的」な違いです。最終的には、どちらも同じように動作します。一部の IDE (Intellij IDEA が思い浮かびます) は、キャッチしError
ても再スローしないと怒鳴ります。