Java 从checkerframework解决空值错误
我有一些如下所示的java代码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) {
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是的,行得通谢谢!