
如何用 IDEA 的 4 个高级调试技巧阅读源码【免费下载链接】toBeBetterJavaer一份通俗易懂、风趣幽默的Java学习指南内容涵盖Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点。学Java就认准二哥的Java进阶之路项目地址: https://gitcode.com/GitHub_Trending/to/toBeBetterJavaer阅读 Java 源码时大多数人只会用红色圆点断点逐行 step然后遇到四个典型麻烦想打印某个变量只好改代码加print调完还得记得删掉想确认某个字段到底在哪里被改只能一点点追调用栈异常抛出来后被 catch 住了想看到抛异常瞬间的变量却停在了 catch 里接口方法被多个子类实现断点打在接口上却进不去实现类。IntelliJ IDEA 自带四种进阶断点能力可以分别解决这四个问题Evaluate and Log at Breakpoints断点处输出日志、字段断点、异常断点和方法断点。本文整理自《二哥的 Java 进阶之路》仓库中的 4 个阅读源码必备的 IDEA 调试技巧按遇到什么问题—怎么操作—如何判断生效的顺序逐一说明。开始之前的前提条件只有一个你有一台已安装 IntelliJ IDEA 的环境社区版或 Ultimate 版均可参见 IDEA 安装文档并且有一个能跑起来的 Java 程序。这四个技巧的共同点是都必须以 Debug 模式运行程序才会生效普通 Run 模式下不会有任何输出或暂停行为。技巧一断点处添加 log不动代码也能打印变量适用问题调试时想观察某个变量或表达式的值但不想修改源码加print避免忘记删除、污染提交记录。操作步骤在你想观察的那一行正常位置用 Shift 鼠标左键点击注意是按住 Shift 再加断点普通左键会直接打上普通断点弹出断点属性面板。勾选Evaluate and log在输入框中填写要观察的表达式。文档示例中观察的目标是isInterested方法每次被调用时随机出来的参数i填写的表达式是interested i。以Debug 模式运行程序。文档中用于演示的示例代码如下public static void main(String[] args) { ThreadLocalRandom random ThreadLocalRandom.current(); int count 0; for (int i 0; i 5; i) { if (isInterested(random.nextInt(10))) { count; } } System.out.printf(Found %d interested values%n, count); } private static boolean isInterested(int i) { return i % 2 0; }Debug 运行后每次命中断点都会在控制台输出表达式结果。下面是文档示例输出具体数值随运行结果变化不作为固定预期interested 7 interested 5 interested 1 interested 2 interested 0 Found 2 interested values如果同时在多处加了这种日志断点光看输出可能分不清哪条来自哪个位置可以在同一弹框中再勾选Breakpoint hit message输出就会带上断点位置信息。文档示例输出如下Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 6 Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 0 ... Found 3 interested values Disconnected from the target VM, address: 127.0.0.1:0, transport: socket需要更详细的调用现场时还可以勾选Stack trace输出中会附带堆栈信息。如何判断生效Debug 模式下控制台按断点命中次数打印出你填写的表达式值说明配置成功如果用的是普通 Run 模式则什么都不会打印这是预期行为而不是配置错误。技巧二字段断点定位字段值到底在哪里被改的适用问题类中某个字段的值在运行中被改了你要找它在哪里被修改只能手动追调用栈逐步排查稍不留神就遗漏。IDEA 允许直接给字段加断点当字段值被修改时自动跳到执行修改的方法位置。操作步骤在字段定义处鼠标左键添加断点该行会出现「眼睛」形状的图标。在「眼睛」图标上鼠标右键。在弹框中同时勾选Field access和Field modification两个选项。勾选含义对应文档的两种触发时机Field access在字段被访问时触发Field modification在字段被修改时触发——排查谁改了它时主要看后者。以 Debug 模式运行后程序会在字段值被修改的那处代码停住停在执行修改的方法内不需要你自己追调用栈。如何判断生效字段值每次被访问/修改时程序自动暂停在对应方法处。如果修改该字段的方法比较多、暂停太频繁可以在断点弹框的Condition一栏自定义进入断点的条件只在满足条件时才暂停。技巧三异常断点让程序停在抛异常之前适用问题代码抛出异常后IDEA 默认是在 catch 住之后才停此时变量现场已经被 catch 逻辑影响。你希望程序停在抛出异常的那一刻查看当时的变量信息。分两步操作第一步先拿到异常类型。让程序正常抛一次异常在 catch 的地方打上普通断点以 Debug 模式运行让程序停住后从调试面板的几个位置可以查看栈顶异常类型。文档示例中拿到的类型是NumberFormatException。第二步按异常类型加断点。打开Exception Breakpoints按文档截图中的入口添加断点然后在弹框中选择刚才查到的异常类型示例中是NumberFormatException。重新以 Debug 模式运行程序程序会直接停在抛出该异常的位置而不是停在 catch 里此时可以查看抛出瞬间的变量信息。如何判断生效程序暂停位置是异常的抛出点且变量面板展示的是抛出前的现场。技巧四方法断点从接口方法直接命中实现类适用问题阅读源码时文档以 Spring 为例一个接口的方法可能被多个子类实现。运行时到底进了哪个实现类通常只能靠查看调用栈逐步定位。IDEA 支持在接口方法上添加断点让程序自动进入真正实现它的方法。操作步骤鼠标左键在接口方法处点击打上断点普通 ◆ 形状。在该断点上鼠标右键在弹框中勾选文档配图绿色框线标出的方法断点选项源文档此处以截图说明勾选项文字部分未列出选项名请对照 源文档截图 操作弹框中同样支持填写Condition自定义跳转条件。以 Debug 模式运行程序。如何判断生效程序不会停在接口方法上而是自动进入实际被调用的实现类方法内此时注意观察断点形状的变化文档特别提示注意断点形状。按文档的说法对Runnable接口的run方法同样适用可以自行验证。使用限制与下一步四个技巧全部依赖 Debug 运行文档明确说明普通模式下运行不会打印Evaluate and log的日志字段断点、异常断点、方法断点同理需要在调试会话中才会暂停。断点处添加 log 只解决观察变量的问题表达式里能引用的变量必须在你断点所在行的作用域内。异常断点的前提是先知道异常类型通过 catch 处断点查看栈顶如果异常类型不固定可以先不加过滤、用文档示例中的方式逐步确认。源文档结尾还提到IDEA 支持各种断点调试类型配图列出了完整分类如果你只会用红色圆点断点建议对照 源文档 中的断点类型总览图完整过一遍本文只覆盖与阅读源码直接相关的四种。【免费下载链接】toBeBetterJavaer一份通俗易懂、风趣幽默的Java学习指南内容涵盖Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点。学Java就认准二哥的Java进阶之路项目地址: https://gitcode.com/GitHub_Trending/to/toBeBetterJavaer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考