Android Studio错误的含义:未注释的参数将覆盖@NonNull参数

我正在尝试Android Studio。 在创build一个新项目并向创buildMyActivity类中添加默认的onSaveInstanceState方法时,当我尝试将代码提交给Git时,出现一个我不明白的奇怪错误。 代码是这样的:

我得到的错误是这样的:

在这里输入图像说明

如果我尝试将方法签名更改为protected void onSaveInstanceState(@NotNull Bundle outState) ,则IDE告诉我它无法parsing符号NotNull

我需要做些什么来摆脱警告?

这是一个注释,但正确的名称是NonNull

 protected void onSaveInstanceState(@NonNull Bundle outState) 

(并且)

 import android.support.annotation.NonNull; 

目的是让编译器在某些假设被违反的时候发出警告(比如一个方法的参数应该总是有一个值,就像在这个特殊情况下,尽pipe有其他的)。 从支持注释文档:

@NonNull注释可以用来表示给定的参数不能为空。

如果已知某个局部variables为空(例如,因为某些较早的代码检查它是否为空),并将该参数作为parameter passing给该参数标记为@NonNull的方法,IDE将警告您一个潜在的崩溃。

他们是静态分析的工具。 运行时行为根本没有改变。


在这种情况下,特别警告的是你重写的原始方法(在Activity )在outState参数上有一个@NonNull注解,但是你没有把它包含在覆盖的方法中。 只是增加它应该解决这个问题,即

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

Android支持库中最近添加了许多有用的支持注释 。 他们的主要angular色是注释各种方法和参数的属性来帮助捕捉错误。 例如,如果您将null值传递给标有NotNull注释的参数,您将收到警告。

可以通过添加以下依赖项将注释添加到您的项目中:

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

你会得到警告,因为Bundle参数是用@NotNull注解标记的,并且通过重写注解被隐藏的方法。 正确的做法是将注释添加到overriden方法的参数。

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

除了其他的答案, @NonNull (和它的对手, @Nullable )注释注解一个字段,参数或方法的返回types。 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 } 

这些注释不会改变运行时行为(尽pipe我已经尝试过),但可以作为防止错误的工具。

请注意,您收到的消息不是错误,而只是一个警告,如果您愿意,可以放心忽略。 另一种方法是自己注释参数,如Android Studio所示:

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