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


104

我正在尝试Android Studio。创建新项目并将默认onSaveInstanceState方法添加到create MyActivity类后,当我尝试将代码提交给Git时,出现了一个我不理解的奇怪错误。代码是这样的:

我得到的错误是这样的:

在此处输入图片说明

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

我需要怎么做才能摆脱警告?

Answers:


124

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

protected void onSaveInstanceState(@NonNull Bundle outState)

(并且)

import android.support.annotation.NonNull;

目的是允许编译器在违反某些假设时发出警告(例如,方法的参数应始终具有值,在这种情况下,尽管还有其他情况)。从支持注释文档中:

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

如果已知局部变量为null(例如,因为某些较早的代码检查了它是否为null),并且将其作为参数传递给了一个方法,该方法将该参数标记为@NonNull,则IDE会警告您潜在的崩溃。

它们是用于静态分析的工具。运行时行为完全不会改变。


在这种情况下,特别的警告是您要覆盖的原始方法(在中Activity@NonNulloutState参数上带有注释,但您没有将其包括在覆盖方法中。只需添加它就可以解决问题,即

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

5
目的是什么?
IgorGanapolsky 2014年

2
@IgorGanapolsky对不起,我没有提到,因为我认为问题仅在于NotNull/ NonNull差异。相应地调整了答案。
matiash

2
换句话说,恕我直言,此注释可以消除函数内部进行空检查的必要,并具有更快的代码。
John Pang

1
@JohnPang您可以,但是由于不能保证强制执行注释所隐含的限制,因此它可能不是一个好主意。
matiash

导入android.support.annotation.NonNull; 寻找这个东西2小时...没有人提到如何导入NonNull ..因此,
投票

15

最近在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);
}

9

除了其他答案外,@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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.