2つの違いは何ですか?両方とも、値がヌルである可能性があり、それに応じて処理される、すなわちヌルをチェックすべきであることを意味するようである。javax.annotation:@Nullableと@CheckForNullの比較
更新:上記 2つのアノテーションがJSR-305/FindBugsのの一部です:あなたは@CheckForNull
を使用する場合と使用したコード: http://findbugs.sourceforge.net/manual/annotations.html
2つの違いは何ですか?両方とも、値がヌルである可能性があり、それに応じて処理される、すなわちヌルをチェックすべきであることを意味するようである。javax.annotation:@Nullableと@CheckForNullの比較
更新:上記 2つのアノテーションがJSR-305/FindBugsのの一部です:あなたは@CheckForNull
を使用する場合と使用したコード: http://findbugs.sourceforge.net/manual/annotations.html
私はそれはあなたが追加のリンクからかなり明確だと思います値がnull
をチェックしない場合、FindBugsはそれをエラーとして表示します。
FindBugsは、@Nullable
を無視します。
実際には、このアノテーションは、オーバーアジャスト
NonNull
注釈をオーバーライドする場合にのみ有効です。
値を常にチェックする必要がある場合は、@CheckForNull
を使用してください。 @Nullable
を使用してください。ここで、null
はOKです。
EDIT:現時点では@CheckForNull
はうまくサポートされていないようですので、避けて@NonNull
(Which @NotNull Java annotation should I use?も参照)を使用することをおすすめします。 もう1つのアイデアは、FindBugs開発者と直接連絡し、ドキュメントの矛盾について意見を聞くことです。
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
FindBugsのバグのように見えます... – lbalazscs
ここでは@CheckForNullの言及は見つかりません:http://findbugs.sourceforge.net/bugDescriptions.html(@NonNullはそこにあります) – vitaly
@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());
}
}
Eclipseは正確に同じものを見つけます** ** Null分析を実行するように設定されていて、正しい注釈を使用します(デフォルトでJSR-305ではなくJDTアノテーションが使用されます)。興味深いことに、@ CheckForNullアノテーションの設定はありません(ただし、@ NonNullByDefaultがあります)。 – vitaly
FindBugs 2.0.1が '@ CheckForNull'のケースを検出しました:"呼び出されたメソッドの戻り値のためにnullポインタ逆参照が可能です。 " –
@DavidHarkness - 2.0.1を使用して再現できません:https://github.com/lischenko/flaming-ninja(findbugs.null.analysisを参照)。 findbugs-maven-plugin = v2.5.2 - 最新の注釈= 2.0.1 – vitaly
デフォルトでサポートされており、間接参照@Nullable
引数や戻り値に任意の試みは、警告になります。
@アレクサンダー-pavlov「&例外の例外」の設定で@javax.annotation.CheckForNull
を追加することができます。 Go File-> Settings-> Inspections-> Probable bugs->一定の条件& exceptions->注釈を設定してください。
@CheckForNull
は、上記の回答に記載されているように@lbalazscsとして@Nullable
よりも明確な意味を持っています。
私はこれらの注釈がJava Bean ValidationのAPIに由来しないと思います。どのライブラリ/フレームワークを使用していますか?注釈のドキュメントはありませんか? –
どちらも普通のJava APIの一部ではないようです。それらはどこに実装されていますか? – vainolo
説明が更新されました。これはJSR-305の一部で、私が使用している実装はFindBugsです。 – vitaly