web-dev-qa-db-ja.com

Google-guavacheckNotNullとIntelliJIDEAの「Java.lang.NullPointerExceptionを生成する可能性がある」

この警告を抑制する方法はありますか?

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を使用していますが、この警告は不要ですが、ここで抑制し、検査をオフにしないようにします。

35
Sebastian

_@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)に移動します。
  • メソッド名にカーソルを置き、 Alt-Enter 意図のポップアップを表示します。
  • 「メソッドコントラクトの追加」を選択します。
  • 契約テキスト_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="&quot;null -&gt; fail&quot;"/>
        </annotation>
    </item>
    <item name='com.google.common.base.Preconditions T checkNotNull(T, Java.lang.Object)'>
        <annotation name='org.jetbrains.annotations.Contract'>
            <val val="&quot;null, _ -&gt; fail&quot;"/>
        </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="&quot;null, _, _ -&gt; fail&quot;"/>
        </annotation>
    </item>
    <item name='com.google.common.base.Preconditions void checkArgument(boolean)'>
        <annotation name='org.jetbrains.annotations.Contract'>
            <val val="&quot;false -&gt; fail&quot;"/>
        </annotation>
    </item>
    <item name='com.google.common.base.Preconditions void checkArgument(boolean, Java.lang.Object)'>
        <annotation name='org.jetbrains.annotations.Contract'>
            <val val="&quot;false, _ -&gt; fail&quot;"/>
        </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="&quot;false, _, _ -&gt; fail&quot;"/>
        </annotation>
    </item>
    <item name='com.google.common.base.Preconditions void checkState(boolean)'>
        <annotation name='org.jetbrains.annotations.Contract'>
            <val val="&quot;false -&gt; fail&quot;"/>
        </annotation>
    </item>
    <item name='com.google.common.base.Preconditions void checkState(boolean, Java.lang.Object)'>
        <annotation name='org.jetbrains.annotations.Contract'>
            <val val="&quot;false, _ -&gt; fail&quot;"/>
        </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="&quot;false, _, _ -&gt; fail&quot;"/>
        </annotation>
    </item>
</root>
_

関連項目

32
Mark Peters

古い問題はJetBrains Yourtrackに存在します このタイプの機能を追加します。何年も前に投票しましたが、活動が見られません。みんなが投票すれば、ラッキーになるかもしれません。

問題を明確にするために、ある種のnullチェックを実行するものとしてメソッドにタグを付けることができるように機能を追加することをカバーしています。それが発生した場合は、Preconditionsメソッドの独自のラッパーを作成して注釈を付けることができます。

[〜#〜] update [〜#〜]機能を待つのに飽きたので、自分でパッチを送信しました。 12.1.1ビルド129.239で利用できます。構成にアクセスするには:[設定]> [検査]> [考えられるバグ]> [一定の条件と例外]> [アサート/チェック方法の構成]。

15
Johnny

メソッドを抽出しますか?

private MyClass getMyClass() {
    /* This always returns an instance of MyClass, never null. */      
}

...

MyClass object = getMyClass();
Preconditions.checkNotNull(object);
merged.setName(object.getName());
2
Kurt

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());
1
milhauz

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自動的に、バイトとソースコードを調べます。

http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/

1
Sanghyun Lee

他のオプションとは別に、あなたは試すことができます-

-を使用して、メソッドレベルで警告を抑制します。

@SuppressWarnings({"NullableProblems"})
public void someMethod(){
   ...
   ...
}

またはコメントを使用してステートメントレベルで警告を抑制します-

//noinspection NullableProblems
someMethodCallProducingNullWarning(null);

ただし、これを行う前に、実際にNPEが生成されないことを確認してください

0
Premraj