こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- 例外クラスを覚えたけど、どこで活用できるのか知りたい方
この記事は後編です。前編の記事はこちら。
[nlink url=”https://kajirinyo.com/java_course_30/”]javaの例外処理を使いこなすためのポイントを解説します(後編)
前回の記事では
- 例外クラスの分類
- 例外クラスの階層
- 例外クラスのサブクラス
に関して解説しました。
これらを覚えることで、
- catchブロックの複数の定義
- throwsの使用
- throwsがあるメソッドのオーバーライド
を使いこなすことができます。
例外クラスの継承図を最初に示します。
catchブロックの複数の定義
catchブロックは複数指定できます。
複数指定する場合はスーパークラスから指定するとコンパイルエラーになります。
サンプル
NullPointerExceptionを例に解説します。
コンパイルに成功するサンプルを示します。
実行結果
NullPointerException::null
このサンプルでは
最初のcatch文にNullPointerException
2番めのcatch文にExceptionを記載しています。
NullPointerExceptionクラスとExceptionクラスは継承関係です。
詳しく言うと、
NullPointerExceptionはRuntimeExceptionのサブクラス、
RuntimeExceptionはExceptionのサブクラスです。
順を逆にするとコンパイルエラーとなります。
コンパイルエラーになるサンプル
このサンプルは最初のcatchでスーパークラスを書いているのでエラーになります。
throwsの利用
呼び出し先メソッドでチェック例外が発生するクラスが存在する場合、
呼び出し元メソッドと呼び出し先メソッドの両方に
try catchを記述するか、throwsを記述する必要があります。
throwsはメソッド内で例外が発生した場合に、
呼び出し元に例外を転送します。
なぜ呼び出し元に例外を転送するかというと、
呼び出し元メソッドのみにtry catch文を書いたほうが管理が楽だからです。
呼び出し先メソッドでtry catch文が書いてあるのに、
呼び出し元でもtry catch文を書いてしまったり、無駄が多くなります。
そのため、呼び出し先メソッドではthrows、
呼び出し元メソッドでtry catch文を書くと決めておけば
try catch文を複数書いてしまうことを防ぎます。
サンプルコード
testメソッドはthrowを使用して、
明示的にException例外を発生させます。
Exceptionはチェック例外クラスなので、
testメソッド内にtry catch文を書かない場合は、
throwsを記載する必要があります。
そして、mainメソッドでtry catch文を記述しています。
mainメソッドでtry catch文を記述しない場合は、
mainメソッドにthrows Exceptionを記述することでもコンパイルが成功します。
throwsがあるメソッドのオーバーライド
throwsがあるメソッドのオーバーライドにはルールがあります。
- ①メソッドがスローする例外クラスと同じかその例外のサブクラス
- ②RuntimeException、RuntimeExceptionのサブクラスの例外はスーパークラスのメソッドに関係なくスローすることが可能
- ③スーパークラスのメソッドにthrowsがあってもサブクラスでthrowsを記述しないことは可能