知是行的主意,行是知的功夫。这篇文章主要讲述Android Studio错误的含义:未注释的参数会覆盖@NonNull参数相关的知识,希望能为你提供帮助。
我正在尝试使用android Studio。在创建一个新项目并向创建MyActivity类添加默认的onSaveInstanceState
方法时,当我尝试将代码提交给Git时,我得到一个我不明白的奇怪错误。代码是这样的:
我得到的错误是这样的:
【Android Studio错误的含义(未注释的参数会覆盖@NonNull参数)】如果我尝试将方法签名更改为protected void onSaveInstanceState(@NotNull Bundle outState)
,则IDE会告诉我它无法解析符号NotNull
。
我需要做些什么才能摆脱警告?
答案这是一个注释,但正确的名称是NonNull
:
protected void onSaveInstanceState(@NonNull Bundle outState)
(并且)
import android.support.annotation.NonNull;
目的是允许编译器在违反某些假设时发出警告(例如应始终具有值的方法的参数,如在此特定情况下,尽管还有其他假设)。来自Support Annotations文档:
它们是静态分析的工具。运行时行为根本不会改变。@NonNull
注释可用于指示给定参数不能为空。
如果已知局部变量为null(例如,因为某些早期代码检查它是否为null),并将其作为参数传递给该参数标记为@NonNull的方法,IDE将警告您已有潜在的崩溃。
在这种情况下,特别警告是你覆盖的原始方法(在
Activity
中)在@NonNull
参数上有一个outState
注释,但是你没有在重写方法中包含它。只需添加它就可以解决问题,即@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
}
另一答案最近在Android支持库中添加了许多有用的support annotations。它们的主要作用是注释各种方法和参数的属性,以帮助捕获错误。例如,如果将
null
值传递给使用NotNull
注释标记的参数,则会收到警告。通过添加以下依赖项,可以使用Gradle将注释添加到项目中:
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
)注释注释了字段,参数或方法返回类型。 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);
}
推荐阅读
- 如果用户在由本机生成的应用程序上隐藏了较低的硬件导航栏,则Android屏幕不适合
- ApplicationDataCompositeValue的大小
- AppFabric安装失败MSI错误代码(1603 |文件已存在)
- 由于Windows 8中的视频卡错误,无法启动Android Emulator和Genymotion。
- Xcode 10(代码签名我的App + Framework失败,因为签署第三方依赖框架(PromiseKit)失败。适用于Xcode 9)
- 我对Sapper / Svelte有一些疑问
- Apple Framework ISA Classicifications
- 没有Android框架创建Android应用程序
- Apple Mach-O链接器错误_OBJC_CLASS _ $ _ FIRInstanceID