必须为非空但仅在使用 lambda 时标记为可为空
must be non-null but is marked as nullable only when using lambdas
我在 sonarqube 中发现了一个奇怪的行为,我不知道这是一个错误,还是我对 lambda 的机制了解不够。
在我们的代码库中,我们有一些代码如下:
@Nullable
private Runnable nulltest(@Nullable String myNullableString) {
if(myNullableString == null) {
return null;
}
return new Runnable() {
@Override
public void run() {
System.out.println("This string is not null: " + myNullableString);
}
};
}
这段代码没问题,sonarqube 没有问题。
但是,如果我将代码更改为像这样使用 lambda:
@Nullable
private Runnable nulltest(@Nullable String myNullableString) {
if(myNullableString == null) {
return null;
}
return () -> System.out.println("This string is not null: " + myNullableString);
}
然后我得到以下错误:
findbugs:NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE
myNullableString 必须为非空但标记为可为空
所以我不明白为什么一次是问题而另一次不是。这是一个错误还是此方法的 lambda 版本和匿名 class 版本之间有真正的区别?
感谢 Thomas Jensen,这似乎确实是一个错误,已经报告给 spotbugs
我在 sonarqube 中发现了一个奇怪的行为,我不知道这是一个错误,还是我对 lambda 的机制了解不够。
在我们的代码库中,我们有一些代码如下:
@Nullable
private Runnable nulltest(@Nullable String myNullableString) {
if(myNullableString == null) {
return null;
}
return new Runnable() {
@Override
public void run() {
System.out.println("This string is not null: " + myNullableString);
}
};
}
这段代码没问题,sonarqube 没有问题。 但是,如果我将代码更改为像这样使用 lambda:
@Nullable
private Runnable nulltest(@Nullable String myNullableString) {
if(myNullableString == null) {
return null;
}
return () -> System.out.println("This string is not null: " + myNullableString);
}
然后我得到以下错误: findbugs:NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE myNullableString 必须为非空但标记为可为空
所以我不明白为什么一次是问题而另一次不是。这是一个错误还是此方法的 lambda 版本和匿名 class 版本之间有真正的区别?
感谢 Thomas Jensen,这似乎确实是一个错误,已经报告给 spotbugs