11

@Nonnullパラメータをアノテーションでマークするメソッドがあります。メソッドを呼び出すコードは、値がnullかどうかをチェックする必要があります。単なるx != nullチェックではなく、別のクラスのユーティリティメソッドを呼び出しています。(実際のコードでは、ユーティリティメソッドはそれが空白の文字列であるかどうかもチェックします)。

私の問題は、Intellij IdeaがNonnullメソッド呼び出しで検査警告を表示し、私の変数が「nullである可能性がある」と言っていることです。ユーティリティメソッドチェックのためにnullにできないことを知っています-インスペクターにそれをどのように伝えることができますか?

それは少し抽象的なので、これが私が意味することの最小限の例です:

package org.ethelred.ideatest;

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

/**
 * tests annotations
 */
public class AnnotationChecker
{
    public static void main(String[] args)
    {
        String x = null;
        if(args.length > 0)
        {
            x = args[0];
        }

        if(!isNull(x))
        {
            useObject(x);
        }

        if(x != null)
        {
            useObject(x);
        }
    }

    public static boolean isNull(@CheckForNull Object o)
    {
        return o == null;
    }


    public static void useObject(@Nonnull Object o)
    {
        System.out.println(o);
    }
}

これは、JSR305アノテーションを使用します。

この例では、Intellijの最初の呼び出しで、パラメーターに「引数'x'がnullである可能性があります」という警告が表示されます。2回目の呼び出しでは、警告はありません。useObjectx

4

4 に答える 4

11

IDEA 13では、メソッドコントラクトと呼ばれる非常に優れた機能が追加されました。たとえば、nullが発生した場合に検証例外をスローするメソッドを作成できます。

@Contract("null -> fail")
public static void validateNull(@Nullable final Object object) {
    if (object == null) {
        throw new ValidationException();
    }
}

可能なNPEの前にそれを呼び出した場合、IDEAは注釈を分析し、警告を表示しません。

validateNull(user);
user.setSomething("something"); // no warning

IDEAの設定に完全なドキュメントがあります(メソッドコントラクトを検索するだけです)。これを機能させるには、jetbrainのアノテーションjarへの追加の依存関係が必要です。

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>13.0</version>
</dependency>
于 2015-07-29T16:14:09.910 に答える
5

IDEA 12を使用すると、NotNullチェックメソッドを構成できます:http: //youtrack.jetbrains.com/issue/IDEA-35808#tab=Comments

于 2013-06-14T06:24:22.273 に答える
4

そのままのコードで警告を解決する方法はないと思います。IntelliJは、ステートメントで@SuppressWarnings使用できる値をサポートしていることを知りたいと思っていましたが、このソースによると、サポートしていません。弾丸をかじって、コードを次のようなものに変更する必要があるかもしれません。useObject(x)

if (x != null && !isBlank(x)) {
    useObject(x);
}

チェックを行う実際のメソッドが他の条件もチェックすることを理解しているためisNull、メソッドの名前をに変更したことに注意してください。isBlanknull

于 2012-05-17T13:51:51.880 に答える
-1

静的メソッドを使用してオブジェクト呼び出しをホワイトリストに登録することで、この問題に対処しました。

/** Wrapper to mask NullPointerException warnings. */
private static <T> T _(T obj) {

    return obj;
}

メソッド名は、読みやすさを妨げないように意図されています。したがって、

mObject.method();

になります

_(mObject).method();

さらに、NullPointerExceptionが発生した場合でも、同じ行番号を参照します。

于 2012-10-17T21:37:50.413 に答える