跳到内容

元数据卡

  • 前置知识:第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"

搜索结果会告诉你:你往数据库里插了一条记录,但主键已经存在了。现在你知道去检查——是不是重复插入了?是不是没做去重?

具体步骤:

  1. 复制完整的错误信息(包括异常类型和关键描述)
  2. 去掉和你项目相关的部分——删掉包名 com.example、类名 MyApp、服务器 IP,保留异常类型和通用描述
  3. 加语言/框架标签 → 比如 NullPointerException Javaduplicate key PostgreSQL Spring Boot
  4. 优先看 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。下面是最小复现:

java
public class Main {
    public static void main(String[] args) {
        User user = getUser(); // 返回 null
        System.out.println(user.getName()); // 报错
    }
}

最小复现的原则:

  1. 去掉所有无关代码——不涉及 bug 的部分全部删掉
  2. 用硬编码数据——不要从数据库或 API 读,直接写死在代码里
  3. 确保可独立运行——别人 copy-paste 就能跑起来
  4. 包含完整的错误信息——你拿到的报错是什么

神奇的现象

写最小复现的过程本身就是在 Debug。很多时候你写到一半,自己就发现 bug 在哪了。这是一个被反复验证的规律——把你的问题讲清楚的过程,就是解决问题的过程

如果写不出来?从有问题的代码里逐行删除,每删一次就运行一次,直到删到不能再删还能复现。这个过程中你自己可能就找到了 bug。

本讲小结

  • 搜错误:完整复制 → 去掉项目相关 → 加语言标签 → 看社区答案
  • 问问题:最小复现代码而非五百行项目代码
  • 写最小复现本身就是在 Debug——写到一半常能自己发现 bug

下一步:练习与排障

理论结束了。现在来实战——热身、挑战、排障,把本章的技能练进肌肉记忆。

第6章:练习与排障

Built with VitePress | Software Systems Atlas