0

我有一些 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超出了我的控制范围,无法进行修改。解决此问题的解决方案是什么?

4

1 回答 1

1

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

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 手册中进行了讨论。

如果您不能直接添加@Deterministic到库中,则可以使用该注释编写存根文件,并在对代码进行类型检查时使用它。

于 2020-07-21T17:05:16.430 回答