web-dev-qa-db-ja.com

@PostConstruct&チェックされた例外

@ PostConstruct docでは、注釈付きメソッドについて述べています。

「メソッドはチェック済み例外をスローしてはなりません。」

たとえば、どのように対処しますか?そのようなメソッドでスローできるIOException?それをRuntimeExceptionでラップし、ユーザーにオブジェクトの初期状態の欠陥について心配させますか?または、@ PostConstructは、依存関係が注入されたオブジェクトを検証および初期化するための間違った場所ですか?

33
fasseg

はい、実行時例外でラップします。 IllegalStateExceptionのようなより具体的なものをお勧めします。

Initメソッドが失敗した場合、通常、アプリケーションは起動しません。

40
Bozho

一般に、いずれかのBeanが例外をスローしたときに欲しい、または期待するアプリケーションの起動に失敗した場合は、Lombokの@SneakyThrowsを使用できます。

正しく使用すると、非常に便利で簡潔です。

@SneakyThrows
@PostConstruct
public void init() {
    // I usually throw a checked exception
}

その長所と短所を議論する最近の記事があります: Lombokの@SneakyThrowsをチェックして例外をRuntimeExceptionsとして再スローすることを推奨

楽しい!

2
wild_nothing

このように軟化した例外を使用して、実質的にRuntimeExceptionでラップします。 https://repl.it/@djangofan/SoftenExceptionjava

private static RuntimeException softenException(Exception e) {
    return checkednessRemover(e);
}
private static <T extends Exception> T checkednessRemover(Exception e) throws T {
    throw (T) e;
}

次に、使用法は次のようになります。

} catch (IOException e) {
        throw softenException(e);
        //throw e; // this would require declaring 'throws IOException'
}
0
djangofan