こんにちは!
Javaを書いていると避けては通れないのが例外です。
やっとのことで例外を理解してもすぐ出てくるのが独自例外。独自例外は自分で作成した例外クラスのことです。
何が便利なの?
独自例外ってそもそも何?
実際にどうやって実装するの?
などさまざまな疑問があると思います。今回はこれらの疑問を一つずつ解決していきます!
ぜひ最後まで目を通してみてください!
Javaの例外処理の基本
独自例外に入る前に少しだけ例外について復習しましょう!
まずJavaの例外には検査例外と非検査例外の二種類があります。
検査例外はコンパイル時に見つかる例外なのでソースコード上で処理文を記述しないとコンパイルに失敗しエラーとなります。
非検査例外は実行時例外(Runtime Exception)でコンパイル時には発見されません。
そのためプログラムを実行して初めて例外が見つかるためバグの原因になりやすいです。
try~catchブロック
例外が発生する可能性があるコードをtryブロックで囲みます。
そしてそのtryブロックで例外が発生した場合の処理をcatchブロックに記述します。
検査例外はtry catchなどで処理を書いておかないとコンパイル時にエラーとなります。
finallyブロック
例外の発生有無に関わらず必ず実行されるコードはfinallyブロックに記述します。
try~catchと一緒に使うことが多いです。
例外の基本についてまだ少し不安な部分がある人は、↓で解説しているので参考にしてください!
独自例外クラスを作る
では本題の独自例外クラスについて説明します!まずはどのように記述するのかをみていきましょう。
最初にサンプルコードです!
public class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
// 他のコンストラクタやメソッド
}
この例ではMyCustomExceptionという例外のクラスを自作しています。
まず独自例外クラスを作成する際にはExceptionクラスかそのサブクラスを継承する必要があります。
なのでextendsキーワードでExceptionクラスを継承しています。
サブクラスってなんだっけ?という人のために少し解説します!
Exceptionクラスは全ての検査例外のスーパークラスです。(こちらを参考)
なのでこのクラスを継承すれば検査例外全てを継承したことになります。
ただExceptionクラスを継承するとコードをパッとみただけではどんな例外が発生するのかわかりにくいです。
なのでサブクラスである、SQLExceptionやNullPointerExceptionを継承してコードの可読性を上げることができます。
先ほどのサンプルコードの解説に戻ります!
public MyCustomException(String message) {
super(message);
}
サンプルコードのこの部分はコンストラクタを定義しています。
そしてこのコンストラクタはString型のmessageを受け取るようにしています。
そしてsuper(message)でこのコンストラクタが受け取ったString型のmessageの内容を親クラスであるExceptionクラスに渡しています。
こうすることでExceptionクラスの機能を用いて、このmessageの内容を表示したりできるようになります。
作成した独自例外を使う
では自作した例外クラスをどのように使うか説明します!ここもまずはサンプルコードから見ていきましょう。
try {
// 例外が発生する可能性のあるコード
throw new MyCustomException("エラーメッセージ");
} catch (MyCustomException e) {
// 例外処理
e.printStackTrace();
}
みてわかるように使い方は他の例外と同じです!
例外が発生する可能性があるコードをtryブロックで囲み、その中で例外をthrowします。
この際自作した例外クラスが引数を受け取る場合はきちんと記述しましょう。
今回はString型の引数を受け取るように独自例外クラスを作成したので文字列を渡しています。
そしてcatchブロック内に例外が発生した際の処理を記述します。
printStacktrace()はスタックトレースと引数で受け取った文字列を表示するメソッドです。
このあたりは普通の例外と同じです!
応用例
ここから少しだけ難しい内容を解説します。
ここまでで十分と思った方も流し見するだけでいいので目を通していただきたいです!
こんなこともできるんだ程度に頭の片隅に置いておくだけでもこの先役に立つことがあると思います。
例外チェイン
例外チェインとは、ある例外が他の例外の原因となる場合に使用される機能です。
Javaではある例外が他の例外を引き起こすことがあります。
その時に原因となる例外の情報を引き起こされる例外に引き継ぐことで処理を簡単に書くことができるのが例外チェインです。
説明だけ聞いてもよくわからないと思うので少し例を出しながら説明します。
例えば次のようなコードで考えます。
try {
// 何らかの処理
} catch (IOException e) {
throw new MyCustomException("ファイル処理中にエラーが発生しました", e);
}
この例ではIOExceptionが発生した際に、それが自作のMyCustomExceptionの原因となる場合を考えています。
こうすることで自作の例外クラスの中でIOExceptionの例外処理についても自由に記述することができ、コードの管理がしやすくなります。
これが例外チェインの考え方です。
まとめ
今回はJavaの独自例外についての疑問を解決してきました。
実際に自分でコードを書いてみないと身につかない部分もあると思うので手を動かして学んでいきましょう!
当ブログではJavaの学習に役立つ参考書を紹介しています↓
NoteではJavaの学習方法もまとめています。そちらもぜひご覧ください!
コメント