はじめに
この記事は、自分と同じ初心者のJavaエンジニア向けに、例外処理に関する本当に基礎的な知識を記載したものです。
ほぼ自分用のメモ書きですが、誰かの役に立てば幸いです。
チェック例外・非チェック例外とは?
チェック例外
外部要因や予測可能な異常状態に対して発生する例外。
これらはプログラムの修正で対処しにくい問題や、外部システムのエラー(例: ファイル操作、ネットワークエラーなど)に関連することが多い。
開発者に「例外処理を忘れないように」と強制する目的で使用される。
(例) ファイルやネットワークのエラー
メソッド内でtry-catchをしたり、メソッドにthorws宣言をしないとコンパイルエラーになる。
チェック例外が生じる処理を実装する場合は、基本的に以下のどちらかの対策をとる。
①メソッド内でtry-catch文を使い、例外処理を完結させる
public void someMethod(){
try{
// チェック例外が生じるメソッドを呼び出す
Hoge hoge = exceptionOccurMethod();
}catch(Exception e){
// 例外が起きたときの処理
}
}
②(さらに呼び出し元クラスが存在する場合)呼び出し元に例外処理を任せるため、メソッドにthrows宣言をつける
// someMethod()を呼び出したメソッドに例外処理を任せる
public void someMethod() throws Exception{
// チェック例外が生じるメソッドを呼び出す
Hoge hoge = exceptionOccurMethod();
}
チェック例外の例:
IOException(入出力操作に関連するエラー)
SQLException(データベース関連のエラー)
非チェック例外
プログラムの修正で対処可能な問題に対して発生する例外。
主にプログラムのバグや設計ミスを示す目的で使用される。
運用中に非チェック例外が発生した場合、設計や実装にミスがあることが疑われる。
(例)バグ、ロジックミス、想定外の動作など。
非チェック例外の例:
NullPointerException(null 参照のオブジェクトにアクセスしようとした場合)
IllegalArgumentException(不正な引数が渡された場合)
補足
補足1:ややこしいthrowsとthrow
throws
メソッドの宣言のときにつける。
非チェック例外が発生する場合のみ。
「このメソッドは例外処理を呼び出し元に任せますよ~」の意味。
throw
メソッドの中に書く。
例外を発生させる処理。
最初のうちはどっちがどっちか覚えづらいですが、英文法で捉えると当たり前なので覚えやすいです。
throws→メソッドが主語なので三人称のsがつく
throw→単なる処理(例外を発生させる)なので動詞の原形
補足2:非チェック例外をtry-catch
非チェック例外もtry-catchしたり、catchして再スローしたりできる。
※非チェック例外は本来、バグやプログラムミスの修正を促すために使われるため、このような実装は特殊。
public void someMethod() {
try{
// 非チェック例外が生じる処理
}catch(RuntimeException e ){
//非チェック例外を再スロー
throw e;
}
}
catchして非チェック例外を呼び出し元に再スローした場合も、メソッドにthrows宣言は不要。