从 checkerframework 解决 Nullness 错误

Resolve Nullness Error from checkerframework

我有一些 java 代码,如下所示

import org.checkerframework.checker.nullness.qual.Nullable;

abstract class Foo {

  abstract @Nullable String getFoo();
  
  void foo() {
    if (getFoo() != null) {
      bar(getFoo());  
    }
  }
  
  void bar(String str) {
      str.charAt(1);
  }
}

这给了我错误

Error: [argument.type.incompatible] incompatible types in argument.
   found   : @Initialized @Nullable String
   required: @Initialized @NonNull String

这是不可理解的,因为 getFoo 被装饰成 Nullable

我可以在不修改 bar 方法的情况下阻止这种情况吗? getFoobar 两种方法都不受我的修改控制。 解决此问题的解决方案是什么?

一般来说,Nullness Checker 认为给定的代码可能会抛出 NullPointerException 是正确的,因为 getFoo() 可能 return 在不同的调用中有不同的值。您可以使用 @Deterministic 方法注释来表示 getFoo() return 在每次调用(在同一接收器上)时具有相同的值:

import org.checkerframework.dataflow.qual.Deterministic;
import org.checkerframework.checker.nullness.qual.Nullable;

abstract class Foo {

  @Deterministic
  abstract @Nullable String getFoo();
  
  void foo() {
    if (getFoo() != null) {
      bar(getFoo());  
    }
  }
  
  void bar(String str) {
      str.charAt(1);
  }
}

这在 Checker Framework manual 中讨论。

如果您不能直接将 @Deterministic 添加到库中,您可以编写带有该注释的 stub file 并在对代码进行类型检查时使用它。