You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何告知Checker Framework空值校验逻辑位于另一方法内

修正后可通过空值检查的完整代码

import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
import org.checkerframework.checker.nullness.qual.Nullable;

class Scratch {

    static class Holder {
        @Nullable Exception exception;

        public Holder(@Nullable Exception exception) {
            this.exception = exception;
        }

        public @Nullable Exception getException() {
            return this.exception;
        }

        public @Nullable Exception getException2ndVariety() {
            if (hasException()) return exception;
            return null;
        }

        // 核心修改:替换错误注解
        @EnsuresNonNullIf(expression = "exception", result = true)
        public boolean hasException() {
            return exception != null;
        }
    }

    public static void main(String[] args) throws Exception {
        Holder holder = new Holder(new Exception());
        // 此处不再抛出空值相关错误
        if (holder.hasException()) throw holder.getException();
    }
}

修改逻辑说明

  • 你之前给hasException()用的@EnsuresNonNull注解语义是方法执行完成后,无论返回值是什么,指定的表达式都非空,通常用于修改字段的void方法,和你的方法逻辑完全不匹配,所以不会生效。替换为@EnsuresNonNullIf后,语义匹配:当方法返回true时,exception字段一定非空,空值检查器进入if分支后会自动识别这个后置条件。
  • @EnsuresNonNullIf注解仅支持标注返回boolean类型的方法,你给返回Exception类型的getException2ndVariety()加这个注解,自然会触发表达式解析错误,删掉这个错误注解即可。

可选优化

如果你需要进一步把getException()的返回值非空性和字段绑定,可以给它补充对应注解:

@EnsuresNonNullIf(expression = "this.exception", result = true)
public @Nullable Exception getException() {
    return this.exception;
}

这样如果你直接判断if (holder.getException() != null),后续使用该返回值也不会触发空值报错。

内容的提问来源于stack exchange,提问作者llaith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:05