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); }
- 在Android Studio中相当于#pragma标记
- 渲染问题在渲染过程中引发exception:com.android.ide.common.rendering.api.LayoutlibCallback
- 你如何在Eclipse中打开一个Android Studio项目?
- 如何在Android Studio / IntelliJ中导入Maven依赖项?
- 使用Build Flavors – 正确地构造源文件夹和build.gradle
- Android Studio:用于编码UTF-8的不可映射字符
- Android Studio“项目结构”不能正常工作
- Android Studio找不到与com.android.support:appcompat-v7:+相匹配的任何版本
- 带有Google Play服务的Android Studio