例外
例外とは
プログラム実行時に想定外の事態が発生して処理が止まってしまうものがある
このような想定外の事態を例外(exception)という
→プログラムが止まらないように対策しておくことができる・・・(例外処理)
例外処理の流れ
try-catch文
tryブロック内で処理を実行中に例外が発生すると、catchブロックに移動して
処理が継続される
例外の種類
・error系例外
catchする必要がない→プログラムでは解決できないため
・exception系例外
catchすべき→プログラムを続けない方が良いため
・RuntimeException系例外
catchしなくてもいい→プログラムで対処できるため
例外インスタンス
例外が発生した場合、例外の詳細情報が詰まったExceptionインスタンスを
変数に代入される
printstackTrace()はExceptionインスタンスが持っているメソッド
catchの仕方
catchは複数書くことができる
多態性が効いてしまい、Exceptionの子インスタンスは全てcatchしてしまう
そのため、Arithmetic Exception等のcacth処理が下にあると
絶対に行わないのでコンパイルエラーになってしまう
必ず行う処理
(ex)ファイルの書き込み
書き込み処理が正常動作しても例外が発生しても「ファイルを閉じる」
という処理が絶対必要になる
→finallyを使う
最終的に行う処理
(ex)
}finally{
ファイルを閉じる
}
例外の伝播
メソッドを呼び出していくと例外が発生した時に途中のメソッドで
try-catch処理をしてしまうとmainメソッドは例外が起きていない
認識になってしまう
スロー宣言・・・例外伝播を許可
書き方
アクセス制御 戻り値 メソッド名() thorows 例外クラス1,
例外クラス2{
メソッド処理内容
}
(ex)
public static void subSub() throws IOException {
FileWriter fw = new FileWriter("hoge.txt");
}
スロー宣言の影響
1 呼び出される側のメソッドは、メソッド内部での「〜Exception」の
キャッチが義務ではなくなる
2 呼び出す側のメソッドは「〜Exceptionを伝播してくる可能性が
あるメソッド」の呼び出しをtry-catch文で囲む義務が生まれる
例外をもみ消さない
空のcatch文を書くなら理由を明確かつコメントで記載すること
例外を発生させる
故意に例外を発生させる
書き方 throw 例外インスタンス
※一般的にはthrow new 例外クラス名("エラーメッセージ")のように書く
※オリジナル例外を定義できる
オリジナル例外
必ずExceptionクラスを継承させる
(ex)
public class Original extends Exception