【Java】例外処理について
例外処理とは何か
まず例外とは、プログラムの実行中に発生し、通常の処理が続行できなくなる想定外の異常事態のことです。
例外処理はそのような例外が起こったときにでも、安全にプログラムを終了できるように適切な対処をしたりあらかじめ対処方法を書いておくしくみです。
基本構文
Java
try{
① 通常実行される、例外が発生する可能性のある処理
}catch(② 例外の種類){
③ 例外発生時に実行される処理
}
例外が起こる可能性のある処理①をtryして、もし指定した種類の例外②が発生した場合、それをcatchし、③を実行します。
例えば、ファイルを読み込む処理を書くとします。
Java
try{
FileReader reader = new FileReader("sample.txt");
System.out.println("ファイルを開きました");
reader.close();} // ①
} catch (IOException e) { // ②
System.out.println("ファイルの読み込みに失敗しました");
}// ③
① は本来実行されて、ファイルを読み込む処理が行われますが、もし『ファイルが見つからない』などの、プログラム側からすれば想定外の例外が発生したときに、
② 『ファイルの読み書き関係のエラー』を『IOException』をキャッチして、
③ 『ファイルの読み込みに失敗しました』を投げ返してくれます。
処理する範囲
ではこの例外処理、どのタイミングで使えばいいのか?という疑問が出てくると思います。
例外処理は事前に想定できないもの、また想定はできても、通常の制御構文(if文など)では対処しづらいものに対して行うものです。
想定できないもの
・ネットワーク障害
・ファイルが存在しない
etc…
これらは実行する環境次第なので、プログラムを正しく書いたとて失敗するときはします。
アプリケーション側としては外の状態までわからないし、手の届く範囲ではありません。外部要因のイメージです。
ですので、『正常に実行できませんでした』という形で例外処理を出します。
またこのような例外を、チェック例外と呼びます。
想定できるが、対処しづらいもの
・変数にNullが入れられた
・存在しないインデックスにアクセスした
etc…
これらはプログラミングなど内部要因にあたるので、事前に注意してコードを書けば避けられはするのですが、すべてを完全に防ぐのは難しく対処しているときりがない場合もあります。
そのため予測できなかったケースや、発生した場合即座に気づきたいものを例外と扱い、それに対して例外処理を出します。
これらは修正の余地がある例外なので、発生したらコードを見直しましょう。
このような例外を非チェック例外と呼びます。
例外処理の使いどころ
便利な例外処理ですが、使えば使うだけいいというわけではありません。
あくまで想定外の事態に対処する仕組みです。
例え話にはなりますが、仕事の現場でもコピー用紙が切れたとか、そんなちょっとした問題が発生するたびに上司を呼び出していては現場は回りません。
よく起こりえる問題はその場で対処できるように、体制、手順、およびコードを整えておくべきです。
入力文字数制限や、空文字入力など、設計で対処可能なものはその段階で防ぐべきです。
メソッド内のif文でチェックするなど、自分で制御できる部分は自分で管理してきましょう。
まとめ
例外処理は「何でも捕まえる仕組み」ではなく、
設計で防げない異常に対する最後の安全装置である。
著者N・W(株式会社ウィズツーワン)