web-dev-qa-db-ja.com

Android St​​udioエラーの意味:注釈なしパラメーターは@NonNullパラメーターをオーバーライドします

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

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

enter image description here

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

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

96
Monomo

これは注釈ですが、正しい名前はNonNullです:

protected void onSaveInstanceState(@NonNull Bundle outState)

(また)

import Android.support.annotation.NonNull;

目的は、compilerが特定の仮定に違反しているときに警告することを許可することです(常に値を持つべきメソッドのパラメーターなど)他にもありますが、この特定のケース)。 Support Annotations ドキュメントから:

@NonNull注釈を使用して、特定のパラメーターをnullにできないことを示すことができます。

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

それらは静的解析のためのツールです。ランタイムの動作はまったく変更されません。


この場合、特定の警告は、オーバーライドする元のメソッド(Activity内)がoutStateパラメーターに@NonNull注釈を持っているが、オーバーライドに含めなかったことです。方法。追加するだけで問題が解決するはずです。

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

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

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

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

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

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

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

ここに例が最適です:

@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
}

これらの注釈は、ランタイムの動作を変更しませんが(これについて experimented を使用しています)、バグを防ぐためのツールとして機能します。

受信したメッセージはエラーではなく、警告であることに注意してください。これは、選択しても無視しても安全です。代わりに、Android St​​udioが提案するように、自分でパラメーターに注釈を付けることもできます。

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