3

null 値を返す関数があります。そこで、JetBrains アノテーションを使用@Nullableして、関数の上にアノテーションを付けました。

@Nullable
public static ConnectionManager getConnectionManager() {
    return connectionManager;
}

次に、Lint インスペクションを実行しました。この関数を使用すると 4 つの場所が見つかりましたが、null チェックは行っていませんでした。

前:

Service.getConnectionManager().onAssetInfoChanged();

後:

if(Service.getConnectionManager() != null) {
    Service.getConnectionManager().onAssetInfoChanged();
}

次に、Lint インスペクションを再度実行します。驚いたことに、私はまだ得ています:

Service.getConnectionManager().onAssetInfoChanged()308 行目のメソッド呼び出し ' ' は ' ' を生成する可能性がありjava.lang.NullPointerExceptionます。

私は何を間違っていますか?これは Lint インスペクターのバグですか?

4

3 に答える 3

5

検査官は完全に間違っているわけではありません。NullPointerExceptionこの場合、 a を持つ可能性があります:Service.getConnectionManager()毎回呼び出してnullいるため、最初に返さなかったとしても、2 回目に返されないことを絶対に確信できる方法はありません: ゲッターは a を持つことができますreturn ...または変数が 2 つのメソッド呼び出し間で同時に設定されている可能性がありますnull

そのため、コードを次のようにリファクタリングできます。

ConnectionManager manager = Service.getConnectionManager();
if (manager != null) {
    manager.onAssetInfoChanged();
}

getConnectionManager()の戻り値の型が typeのオブジェクトであると仮定しますConnectionManagerNullPointerExceptionこれにより、その行にを持つことは不可能です。

于 2016-01-14T15:12:30.377 に答える
3

問題は、あなたがService.getConnectionManager()2 回電話をかけていることです。実際に使用するときの 2 回目の呼び出しで、Lint は null になる可能性があると仮定する必要があります。これを解決する 1 つの方法は、次のようなローカル変数を使用することです。

ConnectionManager connectionManager = Service.getConnectionManager();
if(connectionManager != null) {
    connectionManager.onAssetInfoChanged();
}

別の、そして私の意見では好ましいアプローチは、最初にヌルを避けることです。Java 8 を使用している場合は、 を使用して、 null になる可能性がある Optionalという事実を表すことができます。ConnectionManager

最善のアプローチは、あなたConnectionManagerが実際に決してないことを確認することですnull

于 2016-01-14T15:12:36.650 に答える
1

まず、@Nullablenull になる可能性のあるメソッド パラメーターに関連しています。逆はNotNull、パラメータを設定する必要があることを意味します。次に、 の各呼び出しはgetConnectionManager、アナライザーによって個別に処理されます。このようにしてください

ConnectionManager connManager = Service.getConnectionManager();
if(connManager != null
{
//do your stuff
}
于 2016-01-14T15:12:43.013 に答える