Lombok でできること確認します。( @SneakyThrows )

2021年5月6日

今日は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の検査例外は全くの悪というわけではありません。
システムの特性をよく考えて検査例外の実装する・しないを決定しましょう。

参考にさせていただいたサイト

Lombok 使い方メモ

Javaの例外処理?

avaの検査例外は、呼び出し側で「どんなに注意しても防げない」異常系

Java 例外処理のサンプル(検査例外)

 

今日はここまで!