oracleJavaSilverの勉強日記(例外の処理)
例外
例外は、プログラム実行中に発生する何らかの「トラブル」を指す。トラブルは、プログラマーの不注意で作りこむバグだけではなく、要件や仕様の間違い、実行マシンの不具合などたくさんある。
例外処理
トラブルが発生した時に「どのように対処すべきか」を記述した処理。
try-catch-finally文
例外が発生する可能性がある処理をtryブロックで括り、例外が発生した時の処理をtryブロックに続くcatchブロックに記述する。例外発生の有無にかかわらず必ず実行したい処理をfinallyブロックに記述する。
構文
try{
例外が発生する可能性がある処理
} catch(例外クラス型 変数){
例外が発生した時の処理
}finally{
例外発生の有無にかかわらず実行したい処理
}
※上の順番を崩してはいけない
※throwは意図的に例外を起こして例外処理を行われること
tryブロック・finallyブロック
1つしか記述できない。
catchブロック
複数のcatchブロックを記述することは可能。
catchブロック内でreturnをしても、finallyブロックが実行されてからreturnする。
もし、catchブロックとfinallyブロックでもreturnしていた場合は、finallyブロックのreturnが上書きされる。
※returnで戻すときはretuen専用の変数があるイメージなので、変数の値が変わっても、returnでで戻ってくる値は変わんない。
検査例外と非検査例外
エラー(Error)
プログラムから直すことのできないトラブル。try catch や throws 宣言をしてもしなくてもいい。
例
OutOfMemoryError
インスタンスやクラスの定義情報を保存するためのヒープメモリが不足した場合にスローされる。
NoClassDefFoundError
実行対象のクラスファイルが見つからなかった場合スローされる。
StackOverflowError
メソッドの実行に必要な情報はメモリのスタック領域に配置される。そのスタック領域が足りなくなった場合にスローされる。
AssertionError
アサーションの条件式に合致しないものがあったときにスローされる。
VirtualMachineError
OutOfMemoryErrorやStackOverflowError、InternalErrorの親クラスで、JVMが壊れているか、動作を継続するために必要なリソースが足りなくなったことを示すためのスロー。
InternalError
JVM内で何らかの内部エラーが発生したこと。
例外(Exception)
プログラムが対処できるトラブル。検査例外と非検査例外の2種類ある。Javaの例外は基本的に検査例外。
検査例外(Exception)
検査例外は例外処理を記述したかどうかをコンパイラ検査を行う例外。基本的に正しいプログラムを書いても避けきれない例外。そのため、try-catch文を書かなければいけない。もしくはthorws句を書く。
RuntimeExceptionおよびそのサブクラス以外のクラス
例
SampleException
非検査例外(RuntimeException)
非検査例外は例外処理を記述したかどうかをコンパイラが検査しない例外。正しいプログラムを書けば回避することができる。そのため、try-catch文を書かなくても書いてもいい。
例
TestException
ArrayindexOutOfBoundException
配列の要素外アクセス
NullPointerException
nullに対してメソッドを呼び出すようなコードを記述した場合。
IndexOutOfBoundsException
配列や文字列、コレクションの範囲外アクセス
StringIndexOutOfBoundException
文字列の範囲外アクセス
ClassCastException
継承関係や実現関係にないクラスをキャストしようとする。
IllegalArgumentException
オブジェクトを利用する再の事前条件を守らなかったこと。
IllegalStateException
準備が終わっていないなど
NunberFormatException
文字列を数値に型変換する時になる。
Staticイニシャライザ
クラスを利用する時に一度だけ呼び出される初期化ブロック。Staticイニシャライザを利用することで、static変数の初期化が可能になる。もし、Staticイニシャライザを処理している時に何らかのトラブルが発生したらExceptionInInitializerErrorが発生する。