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が発生する。