必须完成语言级别、编译器配置与IDE分析三者协同设置:Project language level设为26(Preview),启用Java Compiler中的Enable JSpecify support,并在Inspections中手动勾选org.jspecify.annotations.NullMarked/Nullable/NonNull。

要在 IntelliJ IDEA 2026 中正确启用并使用 JSpecify 空安全注解(如 @NullMarked、@Nullable、@NonNull),必须完成语言级别、编译器配置与 IDE 分析三者的协同设置,缺一不可——否则即使代码写了 @NullMarked,IDE 也不会报任何空指针风险。
确认项目已启用 Java 26 语言级别
打开 File → Project Structure → Project,将 Project SDK 设为 JDK 26 或更高版本,Project language level 必须选为 26 (Preview)。若仍显示 25 或更低,IDE 将完全忽略 JSpecify 注解语义,所有空值检查退化为传统模式。
点击 OK 后,右下角会弹出“Reload project”提示,必须点击确认——不重载,新语言级别不会生效。
启用 JSpecify 编译器支持
进入 Settings → Build, Execution, Deployment → Compiler → Java Compiler,勾选 Enable JSpecify support。该选项仅在 Java 26 语言级别启用后才可见。
注意:此开关控制编译器是否将 @NullMarked 视为模块级默认非空契约;若未勾选,javac 会静默跳过所有 JSpecify 注解,不生成任何空安全警告或错误。
配置 IDE 空值分析识别 JSpecify 注解
前往 Settings → Editor → Inspections → Probable bugs → Nullability issues,点击右侧的 Configure annotations… 按钮。
在弹出窗口中,确保以下三项已勾选并处于激活状态:
• org.jspecify.annotations.NullMarked
• org.jspecify.annotations.Nullable
• org.jspecify.annotations.NonNull
这一步是关键分水岭:IDE 默认只识别 JetBrains 和 javax 的旧注解,JSpecify 类型必须手动加入白名单,否则静态分析根本不会扫描它们。
验证空值检查是否生效
方法一:新建一个类,顶部添加 @NullMarked,然后声明一个未初始化的 String 字段:
使用 idealista CLI 按位置(城市、城镇、地区、街道)搜索 Idealista 房源并获取详情。适用于用户请求 Idealista 市场数据或需要 idealista‑cli 命令/标志时。
@NullMarked<br>public class Example {<br> String name; // 此处立即出现黄色波浪线,提示「Field may be null」
方法二:在方法参数上标注 @Nullable,再在方法体内直接调用 .length() —— IDE 会在该行标红,提示「Method invocation may produce NullPointerException」。
若以上任一场景未触发警告,请返回前三个步骤逐一核对:语言级别→编译器开关→注解配置,三者必须全部到位。
处理 @NullMarked 模块级默认行为
第一步:在模块根包的 package-info.java 中写入:
package com.example;<br>@NullMarked<br>module com.example.app { }
第二步:确保该文件被 IDE 正确识别为模块描述符——它必须位于 src/main/java/com/example/package-info.java,且所在目录结构与包名严格一致。
【package-info.java 文件名大小写必须全小写,拼错为 Package-info.java 或 PACKAGE-INFO.java 将导致 @NullMarked 失效】
第三步:在任意子包中新建类,声明一个未初始化的 String 字段,IDE 应立刻标记为潜在空值——这证明模块级默认非空契约已激活。

















