Answers:
这是一个批注,但正确的名称是NonNull
:
protected void onSaveInstanceState(@NonNull Bundle outState)
(并且)
import android.support.annotation.NonNull;
目的是允许编译器在违反某些假设时发出警告(例如,方法的参数应始终具有值,在这种情况下,尽管还有其他情况)。从支持注释文档中:
该
@NonNull
注释可以用来表示一个给定参数不能为空。如果已知局部变量为null(例如,因为某些较早的代码检查了它是否为null),并且将其作为参数传递给了一个方法,该方法将该参数标记为@NonNull,则IDE会警告您潜在的崩溃。
它们是用于静态分析的工具。运行时行为完全不会改变。
在这种情况下,特别的警告是您要覆盖的原始方法(在中Activity
)@NonNull
在outState
参数上带有注释,但您没有将其包括在覆盖方法中。只需添加它就可以解决问题,即
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
}
NotNull
/ NonNull
差异。相应地调整了答案。
最近在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
在编译时警告您。
一个最好的例子是:
@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);
}