🐷

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