コードを見るだけで、例外クラスがチェックされているかチェックされていないかを判断できますか? 例外を拡張した場合はチェックされるといつも思っていましたが、RuntimeException は Exception を拡張し、それはチェックされていません。RuntimeException は、その経験則を曲げる唯一のクラスである可能性があり、RuntimeException を拡張しない場合、他の未チェックの例外は Throwable を拡張する必要があります。ただし、RuntimeException と Exception の違いがわかりません。違いはインタプリタ自体の中で定義されているのだろうか?
8 に答える
RuntimeException
およびそのサブクラスは未チェックの例外です。その他はすべてチェック例外です。
チェックされていない例外の定義は、 Java チュートリアル(強調は私のもの) で見つけることができます。
... Java プログラミング言語では、未チェックの例外(RuntimeException、Error、およびそれらのサブクラス)をキャッチまたは指定するメソッドは必要ありません...
コードを見るだけで、例外クラスがチェックされているかチェックされていないかを判断できますか?
はい。JLS ( 11.1.1 ) で指定されているルールを知っていれば、例外のスーパークラスのコードも見ることができます (階層を確認できるようにするため)。
規則では、次の例外を除き、例外が「チェック」されます。
RuntimeException
およびそのサブクラスError
およびそのサブクラス、
これは「未チェック」です。
違いはインタプリタ自体の中で定義されているのだろうか?
いいえ、Java 言語仕様に含まれています。実際、JVM はチェックされた例外とチェックされていない例外を同じように扱います。チェック例外が正しく処理されているかどうかのすべてのチェックは、Java コンパイラーによって行われます。
ただし、RuntimeException が Throwable ではなく Exception を拡張する理由はまだわかりません。Exception で定義された動作をオーバーライドするものが RuntimeException にないことを考えると、その設計上の選択は矛盾しているように見えます。
その通りです。その上、論理的な矛盾は見当たりません。
は、回復不能な
Error
状態を表します。アプリケーションに何かを強制する意味がないため、チェックされていません。An
Exception
は、回復可能な状態を表します。A
RuntimeException
は、アプリケーションに強制的に対処させたくない、回復可能な可能性のある状態を表します。(しかし、望むならそうすることができます)。
明らかに、この分類法により、a はRuntimeException
>>is<< でありException
、>>not<< でありError
、それが例外クラス階層をそのように定義する論理的根拠です。
「キャッチされたものとキャッチされていないもの」ではなく、「チェックされたものとチェックされていないもの」の例外と呼ばれます。コンパイル時にチェックされた例外は制御されます。つまり、何かが例外契約に準拠していない場合、コンパイラは警告しますが、チェックされていない例外は実行時にスローされる可能性があります。
の継承ツリーはThrowable
実際には次のようになります。
スロー可能なエラー 例外ランタイム例外
Error
拡張またはRuntimeException
宣言する必要のないものをスローする場所。通常、エラーは JVM によってのみスローされ、非常に悪いことが起こっていることを示します。
拡張するException
が拡張RuntimeException
しないものはすべて宣言する必要があります。一般Exceptions
に、呼び出し元のコードで処理または考慮する必要があるもの (たとえば、「ファイルを開くことができませんでした」)RuntimeExceptions
と、コードのバグまたはデータの破損を示す可能性が高いものNullPointerException
です。それについて何でも。
IDE を使用している場合、最も簡単な方法は、IDE がエラー/下線を表示して、未処理の例外をキャッチしていないことを知らせる場合です。それらはチェック例外です。
または、RuntimeException から継承するものはすべてチェックされません。
明示的にメソッドまたはコードを使用している場合throws exception
は、その例外をキャッチする必要があり、コードを確認することで、キャッチする必要があると確信しているため、これがチェックされますException
。コードをRuntimeException
見ると、このコードが例外をスローすることを保証できないため、チェックされていません。
Java ドキュメント リファレンス
メソッドによってスローされる例外はすべて、メソッドのパブリック プログラミング インターフェイスの一部です。メソッドを呼び出す人は、メソッドがスローする可能性のある例外について知っておく必要があります。これらの例外は、そのメソッドのパラメーターや戻り値と同じくらい、そのメソッドのプログラミング インターフェイスの一部です。