必须为非空但仅在使用 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

https://github.com/spotbugs/spotbugs/issues/552