例外

例外とは

プログラム実行時に想定外の事態が発生して処理が止まってしまうものがある

このような想定外の事態を例外(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