从 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
方法的情况下阻止这种情况吗? getFoo
和 bar
两种方法都不受我的修改控制。
解决此问题的解决方案是什么?
一般来说,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 并在对代码进行类型检查时使用它。
我有一些 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
两种方法都不受我的修改控制。
解决此问题的解决方案是什么?
一般来说,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 并在对代码进行类型检查时使用它。