2012-09-06 8 views
34

2つの違いは何ですか?両方とも、値がヌルである可能性があり、それに応じて処理される、すなわちヌルをチェックすべきであることを意味するようである。javax.annotation:@Nullableと@CheckForNullの比較

更新:上記 2つのアノテーションがJSR-305/FindBugsのの一部です:あなたは@CheckForNullを使用する場合と使用したコード: http://findbugs.sourceforge.net/manual/annotations.html

+0

私はこれらの注釈がJava Bean ValidationのAPIに由来しないと思います。どのライブラリ/フレームワークを使用していますか?注釈のドキュメントはありませんか? –

+0

どちらも普通のJava APIの一部ではないようです。それらはどこに実装されていますか? – vainolo

+0

説明が更新されました。これはJSR-305の一部で、私が使用している実装はFindBugsです。 – vitaly

答えて

27

私はそれはあなたが追加のリンクからかなり明確だと思います値がnullをチェックしない場合、FindBugsはそれをエラーとして表示します。

FindBugsは、@Nullableを無視します。

実際には、このアノテーションは、オーバーアジャストNonNull注釈をオーバーライドする場合にのみ有効です。

値を常にチェックする必要がある場合は、@CheckForNullを使用してください。 @Nullableを使用してください。ここで、nullはOKです。

EDIT:現時点では@CheckForNullはうまくサポートされていないようですので、避けて@NonNullWhich @NotNull Java annotation should I use?も参照)を使用することをおすすめします。 もう1つのアイデアは、FindBugs開発者と直接連絡し、ドキュメントの矛盾について意見を聞くことです。

+0

Alexanderの回答からコードを実行した後、FindBugsから得た唯一の警告は です。 'nonnull()はnullを返すかもしれませんが宣言されています@NonNull at test.java:[line 19]メソッドcom.db.icestation.testにあります。nonnull() ' バグの説明は' Methodはnullを返すかもしれませんが、@ NonNullとして宣言されています。このメソッドはnull値を返すかもしれませんが、メソッド(またはオーバーライドするスーパークラスメソッド)は@NonNullを返すように宣言されています。バグの種類とパターン:NP - NP_NONNULL_RETURN_VIOLATION' – vitaly

+0

FindBugsのバグのように見えます... – lbalazscs

+0

ここでは@CheckForNullの言及は見つかりません:http://findbugs.sourceforge.net/bugDescriptions.html(@NonNullはそこにあります) – vitaly

9

@Nonnullおよび@Nullableは、IntelliJ IDEAによって正しく処理されます。 FindBugsは@Nonnullの問題を発見しましたが、@Nullable@CheckForNUllの問題が見つかりませんでした。 IDEAとFindBugsによって検出された問題はコメントでマークされています。 IntelliJのアイデア@javax.annotation.Nullable

package com.db.icestation; 

import javax.annotation.CheckForNull; 
import javax.annotation.Nonnull; 
import javax.annotation.Nullable; 

public class test { 

    public @Nullable String nullable() { 
     return ""; 
    } 
    public @Nonnull String nonnull() { 
     return null; // IDEA, findbugs 
    } 
    public @CheckForNull String checkForNull() { 
     return null; 
    } 

    public static void main(String[] args) { 
     System.out.println(new test().nullable().length()); // IDEA 
     System.out.println(new test().nonnull().length()); 
     System.out.println(new test().checkForNull().length()); 
    } 
} 
+0

Eclipseは正確に同じものを見つけます** ** Null分析を実行するように設定されていて、正しい注釈を使用します(デフォルトでJSR-305ではなくJDTアノテーションが使用されます)。興味深いことに、@ CheckForNullアノテーションの設定はありません(ただし、@ NonNullByDefaultがあります)。 – vitaly

+1

FindBugs 2.0.1が '@ CheckForNull'のケースを検出しました:"呼び出されたメソッドの戻り値のためにnullポインタ逆参照が可能です。 " –

+0

@DavidHarkness - 2.0.1を使用して再現できません:https://github.com/lischenko/flaming-ninja(findbugs.null.analysisを参照)。 findbugs-maven-plugin = v2.5.2 - 最新の注釈= 2.0.1 – vitaly

3

デフォルトでサポートされており、間接参照@Nullable引数や戻り値に任意の試みは、警告になります。

@アレクサンダー-pavlov「&例外の例外」の設定で@javax.annotation.CheckForNullを追加することができます。 Go File-> Settings-> Inspections-> Probable bugs->一定の条件& exceptions->注釈を設定してください。

@CheckForNullは、上記の回答に記載されているように@lbalazscsとして@Nullableよりも明確な意味を持っています。

関連する問題