@NonNull 在 null 检查在另一个 method/class 中时的用法

@NonNull usage when null check is in another method/class

我正在尝试提取 Android 库的一些常见检查并同时添加可空性注释,但我收到警告。

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

 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;
      }

这是一个例子"precheck" class:

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 时返回一个错误代码,所以我知道在使用参数调用内部方法时它是安全的并且非空的,但是 IDE 仍然不高兴并且认为参数可以为空。我将如何修复 Android Studio 中的警告并正确执行此操作?

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

我认为最好的做法是在完成预检查代码 运行 后断言 param 不为空。

assert param != null;

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

会起作用。