Android Studioエラーの意味:アノテーションが付けられていないパラメーターは@NonNullパラメーターをオーバーライドします


104

Android Studioを試しています。新しいプロジェクトを作成し、デフォルトのonSaveInstanceStateメソッドをcreate MyActivityクラスに追加すると、コードをGitにコミットしようとすると、理解できない奇妙なエラーが発生します。コードはこれです:

私が得るエラーはこれです:

ここに画像の説明を入力してください

メソッドシグネチャをに変更しようとするとprotected void onSaveInstanceState(@NotNull Bundle outState)、IDEは、シンボルを解決できないことを通知しますNotNull

警告を取り除くには何をする必要がありますか?

回答:


124

これは注釈ですが、正しい名前はNonNull次のとおりです。

protected void onSaveInstanceState(@NonNull Bundle outState)

(そしてまた)

import android.support.annotation.NonNull;

目的は、特定の前提条件に違反しているときにコンパイラーが警告できるようにすることです(この特定のケースでは、常に値を持つはずのメソッドのパラメーターなど)。以下からのサポート注釈のドキュメント:

@NonNull注釈は、与えられたパラメータがnullでないことを示すために使用することができます。

ローカル変数がnullであることがわかっている場合(たとえば、以前のコードがnullかどうかをチェックしたため)、その変数をパラメーターとして@NonNullとしてマークされているメソッドに渡すと、IDEから次の警告が表示されます。潜在的なクラッシュ。

これらは静的分析のためのツールです。実行時の動作はまったく変更されません。


この場合、特定の警告は、オーバーライドする元のメソッド(でActivity@NonNulloutStateパラメーターの注釈が含まれているが、オーバーライドするメソッドには含まれていないという警告です。それを追加するだけで問題が解決するはずです。

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

5
それの目的は何ですか?
IgorGanapolsky 2014

2
@IgorGanapolsky申し訳ありませんが、質問はNotNull/のNonNull違いのみであると想定していたため、そのことについては言及していませんでした。それに応じて答えを調整しました。
マティアッシュ2014年

2
言い換えると、IMHO、このアノテーションは、関数内のnullチェックの必要性をなくし、より高速なコードを作成できます。
John Pang

1
@JohnPang できます、注釈によって暗示される制限が実際に強制されることが保証されていないため、それは良い考えではない可能性があります。
マティアッシュ2015年

import android.support.annotation.NonNull; このことを2時間探しています... NonNullをインポートする方法については誰も言及していません。それゆえ
賛成

15

最近、いくつかの便利なサポートアノテーションがAndroidサポートライブラリに追加されました。それらの主な役割は、さまざまなメソッドとパラメーターのプロパティに注釈を付けて、バグの検出を支援することです。たとえばnullNotNull注釈でマークされたパラメーターに値を渡すと、警告が表示されます。

次の依存関係を追加することで、Gradleを使用してプロジェクトに注釈を追加できます。

dependencies {
    compile 'com.android.support:support-annotations:20.0.0'
}

Bundleパラメータに@NotNull注釈が付けられており、メソッドをオーバーライドすると注釈が非表示になるため、警告が表示されます。正しいことは、オーバーライドされたメソッドのパラメーターにも注釈を追加することです。

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

9

他の回答に加えて、@NonNull(およびその反対者である@Nullable)アノテーションは、フィールド、パラメーター、またはメソッドの戻り値の型に注釈を付けます。IntelliJ、したがってAndroid StudioはNullPointerException、コンパイル時に可能性のあるを警告することができます。

例がここにあります:

@NonNull private String myString = "Hello";

@Nullable private String myOtherString = null;

@NonNull 
public Object doStuff() {
    System.out.println(myString.length); // No warning
    System.out.println(doSomething(myString).length); // Warning, the result might be null.

    doSomething(myOtherString); // Warning, myOtherString might be null.

    return myOtherString; // Warning, myOtherString might be null.
}

@Nullable
private String doSomething(@NonNull String a) {
    return a.length > 1 ? null : a; // No warning
}

これらのアノテーションはランタイムの動作を変更しません(ただし、これを試しました)が、バグを防ぐためのツールとして機能します。

受け取ったメッセージはエラーではなく、警告であり、必要に応じて無視しても問題ないことに注意してください。代わりに、Android Studioが提案するように、自分でパラメータに注釈を付けることもできます。

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.