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

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

我得到的错误是这样的:

如果我尝试将方法签名更改为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可以在编译时警告您可能的NullPointerExceptions。

一个例子最好:

@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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值