例外とは
Javaで例外処理をするのに色々調べてて、そもそも例外について詳しく知らなかったので調べてみました。
Java言語の例外とはプログラムの誤りを検知し、適切なエラー処理を行うための機構です。
Java言語プログラミング言語レッスン下
具体的にはこんな時に発生します。
- 配列の長さを超えた添え字で要素を取得する
- 存在しないファイルを開く
- オブジェクトを作りすぎてメモリが足りなくなる
このような状況に対して適切な処理を行うのを例外処理と言いますね。ではこの例外にはどんな種類があるのでしょうか?
例外の階層と種類
例外のクラス構造はこのようになっています。Objectは全てのクラスのルートにあるクラスですね。
Throwableはthrow文で投げることができ、catch節で例外をキャッチすることができます。Throwableは大きく2つに分けることができ、それがErrorとExceptionになります。
Object |_Throwable |_Error |_Exception |_RuntimeException |_それ以外のException
Error
Errorは動作を継続するのは期待できないときに投げられるクラスです。例えば、メモリが足りなくなったり、スタックオーバーフローを起こしたりしたときに投げられます。
Exception
Exceptionは正しく例外処理を行うことで、動作を継続することが期待できるときに投げられるクラスです。例えば、配列の範囲を超えてアクセスしようとしたときや、存在しないファイルを開こうとしたときに投げられます。
ExceptionはさらにRuntimeExceptionとそれ以外に分けることができます。
RuntimeException
RuntimeExceptionは実行中に発生し、コンパイラによって前もってチェックできない例外を表すクラスのことです。
例えば、配列の範囲を超えてアクセスしたり、整数で0の割り算を行ったり、数値にできない文字列を数値に変換しようとしたりした場合に発生します。
RuntimeException以外のException
これはコンパイルによって前もってチェックできる例外のクラスのことです。例えば、ファイルを開こうとしたが見つからなかったり、開こうとしたら最後までたどり着いたなどの場合です。
チェックされる例外とされない例外
ある例外がコンパイラにチェックされる例外(checked exception)かどうかは非常に重要になります。
- チェックされない例外→ErrorとRuntimeException
- チェックされる例外→RuntimeException以外のException
チェックされる例外
チェックされる例外はコンパイラがコンパイル時にチェックする例外で、RuntimeException以外のExceptionになります。例えばあるメソッドの中で
throw new IOexception();
としている場合、下記のいずれかを実装しなければいけません。
- メソッド内のcatch節でその例外をキャッチする
- メソッド内のthrows節で例外を投げることを宣言する
チェックされない例外
コンパイラでチェックされない例外をわかりやすく言うと、「いつ、どこで発生してもおかしくない例外」のことでコンパイラでいちいちチェックしていられない例外ということです。
なので配列の範囲を超えてアクセスしたり、メモリ不足で発生する例外はチェックされない例外となるのです。
まとめ
例外を詳しく調べるだけでかなり勉強になりました。
ちょっとしたことだけどしっかり理解しておくことで例外処理の仕方だったり、Exceptionの意味が今後理解しやすくなったかなと思います。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す