Java 从checkerframework解决空值错误

Java 从checkerframework解决空值错误,java,checker-framework,Java,Checker Framework,我有一些如下所示的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) {

我有一些如下所示的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
方法的情况下防止这种情况发生吗?我无法控制对
getFoo
bar
这两种方法的修改。
解决此问题的解决方案是什么?

通常,空值检查器是正确的,给定代码可能会抛出NullPointerException,因为
getFoo()
可能会在不同的调用中返回不同的值。您可以使用方法注释表示
getFoo()
在每次调用(在同一接收器上)时返回相同的值:

import org.checkerframew.dataflow.qual.Deterministic;
导入org.checkerframework.checker.nullness.qual.Nullable;
抽象类Foo{
@确定性
抽象@Nullable字符串getFoo();
void foo(){
如果(getFoo()!=null){
bar(getFoo());
}
}
空栏(字符串str){
查拉特str.charAt(1);
}
}
本节将对此进行讨论


如果您不能直接将
@Deterministic
添加到库中,您可以使用该注释编写一个注释,并在检查代码类型时使用它。

您是否尝试过将
@Nullable
更改为
@NonNull
?这两种方法
getFoo
bar
都超出我的修改控制范围,因为它们都来自不同的库,我正在我的项目中使用它们。最后一种方法是围绕任何类编写一个包装器,如果可能的话,我正在寻找除此之外的解决方案。如果您调用它一次,存储结果,然后检查它,然后将其传递给bar(),也许这样行吗?@Taschi是的,行得通谢谢!