当null检查在另一个方法/类中时,@ NonNull用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当null检查在另一个方法/类中时,@ NonNull用法相关的知识,希望对你有一定的参考价值。

我试图抽象一些android库的常见检查并同时添加Nullability注释但我收到警告。

假设我在这个库中有一个示例方法:

 public int method(@Nullable final String param) {
    final int precheckResult = LibPrechecks.checkForMethod(param); // Does check for param not being null
    if (LibPrechecks.checksFailed(precheckResult)) {
      return precheckResult;
    }

    // Rest of logic
    return internalMethod(param); // IDE is complaining that param cannot be null
  }

然后调用库的另一个内部方法进行一些处理:

     private int internalMethod(@NonNull String param) {
        // processing logic

        return 0;
      }

这是一个示例“预检”类:

public class LibPrechecks {

  public static int checkForMethod(@Nullable final String param) {
    if (param  == null) {
      return -1;
    }
    return 0;
  }

  public static boolean checksFailed(final int precheckResult) {
    return precheckResult < 0;
  }
}

我在null上返回一个错误代码,所以我知道在使用param调用内部方法时它是安全的和非null,但IDE仍然不满意并认为param可能为null。如何在Android Studio中修复警告并正确执行此操作?

答案

IDE不知道checkForMethod()checksFailed()做了什么,因此您需要抑制警告或编写IDE可以静态分析的一些代码以证明param不为空。

我认为最好的办法是断言在预检代码运行完毕后param不为null。或

assert param != null;

要么

if (param == null) throw new AssertionError();

将工作。

以上是关于当null检查在另一个方法/类中时,@ NonNull用法的主要内容,如果未能解决你的问题,请参考以下文章

删除 index.php 并处理两个 Codeigniter 站点的子域,当一个在另一个站点中时

当分配规则存储在另一个tibble中时,如何用新值替换tibble中的数据?

YDN-DB 获取 Store: null 不存在

在另一个文件中扩展类的正确方法是啥?

当伴生对象在类中时使用 .tupled 方法

当它隐藏在另一个片段中时,以编程方式在 CoordinatorLayout 中显示 BottomNavigationView