Android Studioを試しています。新しいプロジェクトを作成し、デフォルトのonSaveInstanceState
メソッドをcreate MyActivityクラスに追加すると、Gitにコードをコミットしようとすると、理解できない奇妙なエラーが発生します。コードはこれです:
私が得るエラーはこれです:
メソッドのシグネチャをprotected void onSaveInstanceState(@NotNull Bundle outState)
に変更しようとすると、IDEは、シンボルNotNull
を解決できないことを通知します。
警告を取り除くために何をする必要がありますか?
これは注釈ですが、正しい名前は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);
}
いくつかの便利な サポートアノテーション が最近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);
}
他の回答に加えて、@NonNull
(およびその反対の@Nullable
)注釈は、フィールド、パラメーター、またはメソッドの戻り値の型に注釈を付けます。 IntelliJ、したがってAndroid Studioは、コンパイル時にNullPointerException
sが発生する可能性があることを警告できます。
ここに例が最適です:
@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 Studioが提案するように、自分でパラメーターに注釈を付けることもできます。
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
}