Lombok でできること確認します。( @SneakyThrows )
今日はJavaの例外を滑らかにしてくれる Lombok の @SneakyThrows を確認したいと思います。
Javaの例外
Javaでは 検査例外 と 非検査例外 に分かれます。
- 検査例外・・・例外処理を記述したのか、コンパイラがする例外
- チェック例外と呼ばれることもある
- 非検査例外・・・例外処理を記述したかどうかコンパイラは関知しない(しったこっちゃない)例外
- ※エラー・・・メモリ不足、クラスロード失敗のような回復不可能な例外
- 非検査例外と性質は同じ、コンパイラは例外処理を記述したのか関知しない例外に属する
に分類されます。
上位のクラスの関係でいうとこんな感じです。
上記のように検査例外であるExceptionクラスの配下に、非検査例外であるRuntimeExceptionがぶら下がる関係となっています。
「検査」というのはJavaの文法でいうと try ~ catch のステートメントと throws 句となります。
Exceptionクラスを継承する(しかしRumtimeException以外)のクラスは検査が必須となります。
この検査例外は結構厄介なもので(本当は有用なものですが・・・)、新しめの言語では実装されることが少なくなってきています。
またJavaでも新しめのクラスでは使用されないことが多いようです。
余談
全くの余談ですが、私は例外の王様であるThrowableがインタフェースだと思っていました。
しかし実際はクラスなのです。名前に「able」が付くからてっきり・・・😑
検査しなくてもいいの!?
Lombok の @SneakyThrows を使用すると検査しなくてもコンパイルエラーにならないようです!
これは期待できます。
ちなみにSneakyとは「こそこそやる」という意味だそうです。
どうやら検査をコソコソっと実装してくれ機能らしいです(笑
実装してみた
まずは検査例外を何もしないで投げてみました。
これが検査例外の最大の特徴ですね。
先ほど「厄介なもの」と書きました。
しかしお仕事では「コンパイル時に問題があると分かる」というのは実は結構大事なことだったりします。
リリース後に発覚なんかしたら修正コストが半端ないですからね。(でも実装はやはりいろいろ厄介)
Lombok の @SneakyThrows を使ってみました。
なんとコンパイルエラーが解消されましたよ😃
Lombok がこっそり検査の実装をしてくれたんですね。
コードも載せておきます。
package com.example.demo;
import lombok.SneakyThrows;
public class HogeLombok {
@SneakyThrows
public String GetAnswer() {
// 検査例外を投げる
throw new Exception("これが答えだ!");
}
}
呼び出し側の実装です。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
// インスタンス化!
HogeLombok v = new HogeLombok();
System.out.println("v " + v.GetAnswer());
}
}
問題なく実装できました。
コンパイルエラーもでないということはHogeLombok#GetAnswerメソッド内でちゃんとtryしているということなんでしょうね。
確認
それでは実行して動作の確認をしてみましょう。
予想通りの結果です。
こんなこともできるそうです
Sneak(こっそり)を実装する対象の例外クラスを指定することもできるそうです。
まとめ
Lombok の @SneakyThrows について確認してみました。
Javaの検査例外はいろいろ厄介なところがあるかと思いますがさすがLombokですね。
Javaエンジニアの気持ちをわしづかみしているような気がします😎
記事中にも記載しましたがJavaの検査例外は全くの悪というわけではありません。
システムの特性をよく考えて検査例外の実装する・しないを決定しましょう。
参考にさせていただいたサイト
avaの検査例外は、呼び出し側で「どんなに注意しても防げない」異常系
今日はここまで!
ディスカッション
コメント一覧
まだ、コメントがありません