2016-11-28 8 views
37

私は次のシグネチャ実行時に@Nonnullアノテーションがチェックされるのはなぜですか?

public static String myFunction(@Nonnull String param) 

私はヌルとしてのparamでそれを呼び出すと、私は次の例外を取得する関数があります。

Caused by: java.lang.IllegalArgumentException: Argument for @Nonnull parameter 'param' of com/MyClass.myFunction must not be null 
    at com.MyClass.$$$reportNull$$$0(MyClass.java) 

javax.annotation.Nonnull実行時にチェックされていないはずが。

誰が実際に例外をスローし、なぜですか?

P.S.私はTomcatサーバーをIntelliJ IDEA 2016.3からOracle JDK 1.8.0_102で実行します。

+0

実際に@Jesper、これらの新しい注釈はこれになされました:コンパイル時にチェックしてください。私の答えを確認することができます.. "コマンドラインでNonNullモジュールを含むコードをコンパイルすると、コンパイラは潜在的な問題を検出した場合に警告を出力します" – BrunoDM

+2

@BrunoDM - ランタイム例外です – Dmitry

答えて

58

IntelliJ IDEAでプロジェクトをコンパイルすると、コンパイルされたクラスのバイトコードが計測され、さまざまなフレーバーの@Nonnullアノテーションのランタイムチェックが追加されます。この動作は、オプションで制御されます。

設定|ビルド、実行、展開|コンパイラ| [x] nullではない注釈付きのメソッドおよびパラメータのランタイムアサーションを追加します。

+1

どのバージョンのIDEAでは、機能が追加されましたか? – Dmitry

+3

この機能はIntelliJ IDEA 5.0に追加されましたが、その時点ではJetBrainsの '@NotNull'アノテーションのみがサポートされていました。最近他の注釈のサポートが追加されました。 – yole

+28

それで、それはすばらしいことに、ビルドツールチェーンとは異なるコードをコンパイルします。それは非常に多くのレベルで間違っています。これは、IntelliJから実行するとユニットテストを失敗させる可能性がありますが、たとえば、maven経由で実行すると失敗します。ユーザがnullチェックと特定の例外がスローされた可能性があります。単体テストはその例外とメッセージを検証しますが、これが途中で行われます。 –

関連する問題