project sdk 和 language level 必须匹配,否则 ide 无法启用对应语法支持,导致 record、sealed 等关键字标红;同时需检查 source root 标记、依赖加载及缓存重建。

Project SDK 和 Language Level 必须匹配
选错 JDK 版本或语言级别,是 Cannot resolve symbol 最隐蔽也最常被忽略的根源。IDEA 不会报错说“你用了 record 却配了 Java 8”,它只会把 record、sealed、switch 表达式标红——因为解析器根本没启用对应语法支持。
-
Project SDK要指向真实安装的 JDK(如Corretto-17),不能是Unconfigured或低版本 JDK -
Language Level必须设为SDK default (17),而非手动锁死为8或11 - Module 级别也要检查:右键模块 →
Open Module Settings→Language level,确保不是继承自 Project 却被意外覆盖
Maven/Gradle 依赖未真正加载
红色报错出现在 @SpringBootTest、HttpServletResponse、SpringRunner 这类外部类上,90% 是依赖没进 classpath,而不是代码写错了。
- 先执行
mvn dependency:tree -Dincludes=org.springframework:spring-core,看输出里有没有该 artifact;空输出说明本地仓库缺失或pom.xml中<dependency></dependency>拼错、被<exclusions></exclusions>删掉了 - Maven 项目点右上角
Reload project图标(或Ctrl+Shift+O);Gradle 项目点Gradle tool window → Refresh - 确认依赖
scope合理:比如javax.servlet-api必须是provided,否则会被打包进 jar 导致冲突
Source Root 和 Resources 标记失效
即使 pom.xml 没问题、JDK 也配对,IDEA 仍可能“看不见”你写的类——因为它没把 src/main/java 当作源码目录。
- 右键
src/main/java→Mark Directory as→Sources Root(不是Test Sources Root) - 同理,
src/main/resources必须标记为Resources Root,否则application.yml里的配置类可能无法被注入 - 如果项目是多模块,每个 module 都要单独检查标记,父 pom 不会自动传递 source root 设置
Invalidate Caches 不等于重启 IDE
很多人点了 Invalidate Caches and Restart… 却只选 Just Restart,这毫无作用。缓存损坏时,必须强制重建索引。
- 务必选择
Invalidate and Restart(不是Just Restart) - 重启后等右下角出现
Indexing completed提示再操作,此时符号表才真正刷新 - 若仍无效,可临时关闭
Settings → Build → Compiler → Build project automatically,避免编译器干扰索引过程
src/main/java 没标记为 Sources Root——三者任一正常都可能掩盖问题,但全错时 IDE 就彻底失明。











