Java: 例外処理のあれこれ
プロローグ
こんにちは。クリスマスまであとわずかですね。
家の玄関にクリスマスリースをかざりましたが、それだけでも気分はうきうきしてきますね。
この記事は、私が本やネットで勉強して自分なりに言葉にしたものです。自分の備忘録みたいなものです。 なので内容に関して誤りもあるかもしれませんが、あしからずご了承くださいませ。
テーマ
例外処理で、よく戸惑いやすい箇所についてまとめました。
例外クラスの階層
例外クラスの階層を記述しています。
Objectクラスを基底クラスとし、その配下には、例外とエラーの基底クラスとしてThrowableクラスが存在する。さらに、その配下にExceptionクラスやErrorクラスが存在している。
※java.lang.は抜粋しています
※クラスは抜粋した内容となっています

上の絵にもあるように、例外処理にはおおきく3つの区分けができる。
| 例外種類 | 特徴 |
|---|---|
| 検査例外 | catch節での補足処理が必要、throws節も同様 |
| 非検査例外 | catch節, throws節での補足記載は自由 |
| エラー例外 | システムエラー用に予約された例外。catch節, throws節での補足記載は自由 |
throw節でのオーバライドについて
クラスもしくはインターフェース継承時のメソッドのオーバライドは、その基底にあるメソッドのthrows節の影響をうけます。
例えとして以下のようなメソッドやクラスを作成した場合
class MyException extends Exception { //省略
}
class ChildException extends MyException { //省略
}
class YourException extends Exception { //省略
}
abstract class MyAbstractSample {
public abstract void method() throws IOException;
public abstract void talk() throws MyException;
}
//正しい例
class MySample extends MyAbstractSample {
@Override
public void method() throws IOException, RuntimeException { //省略
}
//@Override
//public void method() { //省略
//}
@Override
public void talk() throws ChildException { //省略
}
}
上記のような場合、throws節のオーバライドは問題ありません。 基底クラスのメソッドと
同一 or サブクラス or 例外の削除 は実装可能です。
また、
非検査例外の追加 も 実装可能です。
次に誤った例を記載します。
//誤った例
class MySample extends MyAbstractSample {
@Override
public void method() throws Exception { //省略
}
@Override
public void talk() throws YourException { //省略
}
}
この場合、基底クラスのメソッドで指定されたクラスの
基底クラス or 無関係なクラス を使用したことで エラーになります。
最後に、
上記では、throws節にExceptionクラスやRuntimeExceptionクラスを指定しているが、
本来は、直接記載したり、場合によってnewすることでインスタンス作成をしない。
エピローグ
ここまで読んで頂きありがとうございます。
spring bootの勉強をしつつ 改めてフレームワーク例外と自作例外の使い分けについて
考えていこうと思います。
Discussion