为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

BIG阳 2023-03-31 10:00:09
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 = !warnIfNulltype = !void|Optional|int|boolean|long|char|short|byte//Replace template for $Statement$:WarnUtils.warnIfNull($Statement$)警告工具:@UtilityClasspublic class WarnUtils {    public <T> @NotNull T warnIfNull(@NotNull T t) {        return t;    }}我不知道如何为多行 lambda 制作模板,而且我不喜欢用其他方法包装所有单行 lambda。我认为脚本过滤器可能会有所帮助,但我不知道如何检查__context__lambda 是否可能返回 null。
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

这个问题可以在没有额外代码检查的情况下解决,只需使用@NotNull在其抽象方法上有注释的功能接口。


例如,如果您需要一个不能返回 null 的供应商,您可以使用此接口:


@FunctionalInterface

public interface NotNullSupplier<T> {

    @NotNull

    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 warnings

Integer result = supplier.get();

if(result != null) // warning - Condition 'result != null' is always 'true'

    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$>


查看完整回答
反对 回复 2023-03-31
  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信