この警告を抑制する方法はありますか?
MyClass object = null;
/*Some code that 'might' set this object but I know it will*/
Preconditions.checkNotNull(object);
//when "assert object != null" is used here no warning is shown
merged.setName(dRElement.getName());
//"May produce 'Java.lang.NullPointerException'" warning here
IntelliJ IDEA 10.5を使用していますが、この警告は不要ですが、ここで抑制し、検査をオフにしないようにします。
_@Contract
_アノテーションと外部アノテーション機能の組み合わせにより、IntelliJがこれらのメソッドの呼び出しに正しい静的分析を適用するようにPreconditions
メソッドにアノテーションを付けることができるようになりました。
この例があるとしましょう
_public void doSomething(Object someArg) {
Preconditions.checkArgument(someArg != null);
someArg.doSomethingElse(); //currently gives NPE warning
if (someArg != null) {
//no warning that this is always true
}
}
_
IntelliJ(私は13を使用しています):
Preconditions.checkArgument(boolean)
に移動します。false -> fail
_を使用します。これで、someArg.doSomethingElse()
の警告が消え、IDEAは、実際、if
ブランチに常にtrueのフラグを立てます。
その他の契約書:
Preconditions.checkArgument(boolean, String)
は_false, _ -> fail
_である必要がありますPreconditions.checkNotNull(Object, String)
は_null, _ -> fail
_である必要があります。これがPreconditions
の完全な_annotations.xml
_ファイルです。
_<root>
<item name='com.google.common.base.Preconditions T checkNotNull(T)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions T checkNotNull(T, Java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions T checkNotNull(T, Java.lang.String, Java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null, _, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean, Java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean, Java.lang.String, Java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean, Java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean, Java.lang.String, Java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _, _ -> fail""/>
</annotation>
</item>
</root>
_
古い問題はJetBrains Yourtrackに存在します このタイプの機能を追加します。何年も前に投票しましたが、活動が見られません。みんなが投票すれば、ラッキーになるかもしれません。
問題を明確にするために、ある種のnullチェックを実行するものとしてメソッドにタグを付けることができるように機能を追加することをカバーしています。それが発生した場合は、Preconditionsメソッドの独自のラッパーを作成して注釈を付けることができます。
[〜#〜] update [〜#〜]機能を待つのに飽きたので、自分でパッチを送信しました。 12.1.1ビルド129.239で利用できます。構成にアクセスするには:[設定]> [検査]> [考えられるバグ]> [一定の条件と例外]> [アサート/チェック方法の構成]。
メソッドを抽出しますか?
private MyClass getMyClass() {
/* This always returns an instance of MyClass, never null. */
}
...
MyClass object = getMyClass();
Preconditions.checkNotNull(object);
merged.setName(object.getName());
Null以外のcheckNotNullメソッドから戻り値を割り当てることもできます: http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/ Preconditions.html#checkNotNull(T)
MyClass object = null;
object = Preconditions.checkNotNull(object);
merged.setName(dRElement.getName());
IntelliJ IDEA 14から、これについて心配する必要はありません。
@Nullable
String extractPrefix(@Nullable String url) {
if (StringUtils.isEmpty(url)) return null;
if (url.startsWith("jar://")) {
...
以前のIntelliJ IDEAは、URLがnullの場合、StringUtils.isEmptyの内部を調べなかったため、コード実行が「startsWith」呼び出しに到達しないという手がかりがありませんでした。もちろん、これらを削除することもできます。 isEmptyの内部を調べて「null-> true」というコントラクトを追加することによるextractPrefixの黄色の警告ですが、それはとても退屈です!それはまさにコンピューターの仕事であり、あなたではありません。IntelliJIDEA自動的に、バイトとソースコードを調べます。
他のオプションとは別に、あなたは試すことができます-
-を使用して、メソッドレベルで警告を抑制します。
@SuppressWarnings({"NullableProblems"})
public void someMethod(){
...
...
}
またはコメントを使用してステートメントレベルで警告を抑制します-
//noinspection NullableProblems
someMethodCallProducingNullWarning(null);
ただし、これを行う前に、実際にNPEが生成されないことを確認してください