元数据卡
- 前置知识:第6章·读懂栈调用、第6章·日志基础
- 预计时间:10 分钟
- 完成标志:能独立搜索错误信息并写出最小复现代码
搜不到的错
你读懂了栈调用,加了日志。但第二个错误出现了,这次你完全看不懂:
org.postgresql.util.PSQLException:
ERROR: duplicate key value violates unique constraint "users_pkey""duplicate……duplicate……"你嘴里念叨着。"复制?什么复制了?"你猜错了方向,浪费了半小时。
"你又来了。"工坊主人叹了口气。"不是所有问题都需要你自己猜。其他人也走过这条路,他们把答案写在了网上。"
搜错误的黄金法则
看不懂?别慌。把异常类型 + 关键信息复制出来搜:
duplicate key value violates unique constraint "users_pkey"搜索结果会告诉你:你往数据库里插了一条记录,但主键已经存在了。现在你知道去检查——是不是重复插入了?是不是没做去重?
具体步骤:
- 复制完整的错误信息(包括异常类型和关键描述)
- 去掉和你项目相关的部分——删掉包名
com.example、类名MyApp、服务器 IP,保留异常类型和通用描述 - 加语言/框架标签 → 比如
NullPointerException Java或duplicate key PostgreSQL Spring Boot - 优先看 Stack Overflow、GitHub Issues、官方文档——社区遇到同样问题的人大概率已经解了
Stack Overflow 的搜索结果通常长这样:
Q:
PSQLException: duplicate key value violates unique constraintA: You're trying to insert a row with a primary key that already exists. Check if you're inserting twice or if your sequence generator is out of sync.
重点放在理解问题原因而不是直接复制粘贴代码。同一个错误可能有一百种成因,你的情况不见得和别人一样。
写最小复现(Minimal Reproducible Example)
你找到了 bug——但自己修不了,需要请教别人。
你打开聊天框开始打字:"我的 Spring Boot 应用报 NullPointerException,连接了 PostgreSQL,用 HikariCP 连接池,调用 UserService 的时候报错了……"
你发了一大段文字过去,附上五百行代码。
对方回了两个字:"太多了。"
你塞了太多无关信息。代码里有数据库连接、配置加载、路由分发、缓存机制……但 bug 可能就在一行里。
这是 Debug 里最被低估的能力——你需要的是一段独立的、尽可能短的代码来复现 bug。
不要这样问问题:
我的 Spring Boot 应用报 NullPointerException,谁能帮我看看?附上 500 行代码。
要这样:
我有一段代码,
user.getName()在特定场景下报了 NullPointerException。下面是最小复现:javapublic class Main { public static void main(String[] args) { User user = getUser(); // 返回 null System.out.println(user.getName()); // 报错 } }
最小复现的原则:
- 去掉所有无关代码——不涉及 bug 的部分全部删掉
- 用硬编码数据——不要从数据库或 API 读,直接写死在代码里
- 确保可独立运行——别人 copy-paste 就能跑起来
- 包含完整的错误信息——你拿到的报错是什么
神奇的现象
写最小复现的过程本身就是在 Debug。很多时候你写到一半,自己就发现 bug 在哪了。这是一个被反复验证的规律——把你的问题讲清楚的过程,就是解决问题的过程。
如果写不出来?从有问题的代码里逐行删除,每删一次就运行一次,直到删到不能再删还能复现。这个过程中你自己可能就找到了 bug。
本讲小结
- 搜错误:完整复制 → 去掉项目相关 → 加语言标签 → 看社区答案
- 问问题:最小复现代码而非五百行项目代码
- 写最小复现本身就是在 Debug——写到一半常能自己发现 bug
→ 下一步:练习与排障
理论结束了。现在来实战——热身、挑战、排障,把本章的技能练进肌肉记忆。