当 lambda 可能返回 null 时,如何让 IntelliJ IDEA 发出警告?

IntelliJ IDEA Constant conditions & exceptions和Return of 'null'中有非常有用的代码检查。当没有注释的方法@Nullable返回时,它们会显示警告,方法、字段或变量null的结果可能计算为。@Nullable@Nullablenull


不幸的是,这不适用于 lambda 表达式。nullIntelliJ IDEA 只是忽略了它们可能的返回。但我很确定有一种方法可以制作用于结构搜索检查的搜索模板,它将找到所有可能从 lambda 表达式返回的内容。null


到目前为止,我已经设法制作了一个模板,它找到了对方法和模板的引用,该模板使用接受通用参数并将其返回的@Nullable方法包装单行 lambda ,它不会更改代码语义并在 lambda 可能返回 null 时显示警告@NotNull.


这是我的模板:


可为空的方法:


@Nullable

$MethodType$ $Method$($ParameterType$ $Parameter$);

可空方法引用


$Qualifier$::$Method$


//Filters for $Method$:

reference = Nullable methods

具有未经检查结果的 Lambda:


($Parameter$) -> $Statement$


//Filters for $Statement$:

text = !warnIfNull

type = !void|Optional|int|boolean|long|char|short|byte


//Replace template for $Statement$:

WarnUtils.warnIfNull($Statement$)

警告工具:


@UtilityClass

public class WarnUtils {

    public <T> @NotNull T warnIfNull(@NotNull T t) {

        return t;

    }

}

我不知道如何为多行 lambda 制作模板,而且我不喜欢用其他方法包装所有单行 lambda。


我认为脚本过滤器可能会有所帮助,但我不知道如何检查__context__lambda 是否可能返回 null。


BIG阳
浏览 146回答 1
1回答

慕运维8079593

这个问题可以在没有额外代码检查的情况下解决,只需使用@NotNull在其抽象方法上有注释的功能接口。例如,如果您需要一个不能返回 null 的供应商,您可以使用此接口:@FunctionalInterfacepublic interface NotNullSupplier<T> {&nbsp; &nbsp; @NotNull&nbsp; &nbsp; T get();}如果您尝试从这种类型的 lambda 表达式返回 null,Constant conditions & exceptions或Return of 'null' code inspection 将检测到它:NotNullSupplier<Integer> supplier = () -> null; // warning - 'null' is returned by the method declared as @NotNull我想注意使用Supplier<@NotNull T>可能会导致提到的代码检查的不正确行为(它一定是一个错误,可能会在以后修复)。这是此类行为的示例:Supplier<@NonNull Integer> supplier = () -> null; // no warningsInteger result = supplier.get();if(result != null) // warning - Condition 'result != null' is always 'true'&nbsp; &nbsp; result++;常量条件和异常代码检查建议“展开‘if’语句”,在这种情况下遵循此建议将导致NullPointerException.为避免此类错误,您可以将以下搜索模板添加到结构搜索检查中://Search template:Supplier<@NotNull $T$>//Replace template:NotNullSupplier<$T$>//Search template:Function<$T$, @NotNull $R$>//Replace template:NotNullFunction<$T$, $R$>//Search template:BiFunction<$T$, $U$, @NotNull $R$>//Replace template:NotNullBiFunction<$T$, $U$, $R$>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java