分两大块:调试时动态创建对象 / 调用方法 + 冷门但超强的调试功能,全部实战可用,面试、排错高频神器。
一、Debug 控制台动态生成对象、执行代码(最核心需求)
IDEA Debug 提供 Evaluate Expression(计算表达式),断点停下后直接写 Java 代码,临时创建对象、调用方法、修改变量。
1. 调出面板三种方式
- 断点暂停后:
Alt + F8(Windows)/Option + F8(Mac) - 右键 → Evaluate Expression
- Debug 控制台底部输入框(直接写代码回车执行)
2. 动态 new 自定义类对象
场景:断点卡住,想临时构造一个 User/DTO 测试逻辑,不用改代码重启。
// 直接写完整构造
User user = new User();
user.setId(1001L);
user.setUsername("test_debug");
user.setAge(20);
// 直接打印
System.out.println(user);
// 调用对象方法
user.getUsername();
复杂对象链式创建:
Order order = new OrderBuilder().orderId(20260618L).status(1).build();
3. 调用静态工具类、Service Bean
调试时直接执行业务方法,快速验证分支:
// 静态工具
String md5 = DigestUtil.md5Hex("123456");
// 如果你当前上下文有service变量,直接调用
userService.getUserById(1001L);
4. 集合快速造测试数据
List<Long> ids = new ArrayList<>();
ids.add(1L);
ids.add(2L);
ids.add(3L);
userMapper.selectBatchIds(ids);
5. 修改当前方法内已有变量
// 原本id=0,强制覆盖
id = 9999L;
// 集合清空/新增
list.add(new User(888,"临时用户"));
补充:Code Fragment Mode(代码片段模式)
Evaluate 弹窗勾选「Code Fragment」,支持多行代码、for 循环、if 判断,完整执行一段逻辑。
二、调试时临时加载、创建对象的冷门高级用法
1. Force Return 强制返回,跳过后续代码
断点停在方法中间,不想执行后面逻辑,直接自定义返回值: 右键 → Force Return
- 基础类型:直接写
true/200/null - 对象:
new Result<>(200,"调试成功",new User(1,"test"))作用:跳过数据库、复杂计算,快速测试上层接收逻辑。
2. Throw Exception 主动抛异常测试异常分支
右键 → Throw Exception,输入异常对象:
new RuntimeException("模拟接口超时异常");
专门用来测 try-catch、全局异常处理器,不用改代码制造错误。
3. 断点条件 + 临时对象过滤(Conditional Breakpoint)
右键断点,输入布尔表达式,满足条件才暂停:
// 只在id=100的user才停下
user.getId() == 100L
// 集合包含指定数据时断住
list.stream().anyMatch(u->"admin".equals(u.getUsername()))
搭配 Evaluate 可以在断点命中瞬间构造对比对象排查。
三、不常用但极度实用的 Debug 功能(重点背诵)
1. Drop Frame 丢弃当前栈帧,重新执行当前方法
冷门天花板:方法执行一半参数传错,不用重启项目。 Debug 面板栈帧区右键 → Drop Frame 效果:回到当前方法调用入口,重新走一遍方法代码,局部变量重置,可以重新单步调试。 限制:不能回退已经提交的数据库操作、异步任务。
2. Watch 监视面板(持久化表达式)
Alt+F8 是一次性执行,Watch 可以保存多条表达式,自动实时刷新:
- 右键变量 → Add to Watches
- 手动新增:
userService.getById(1L)、list.size()、user.getOrderList().get(0).getAmount()循环遍历代码时自动更新值,不用反复执行表达式。
3. Stream Trace Stream 流调试神器
代码有复杂 stream().filter().map().sorted() 很难定位中间值: 断点停在 Stream 代码行,右键 → Trace Current Stream Chain 弹出可视化面板:每一步过滤、映射、排序后的元素,一目了然,解决流调试黑盒问题。
4. Inline Debugger 内联调试提示
设置开启:Settings → Debugger → Inline Debugging 代码行右侧直接显示当前变量值、集合内容,不用切到底部变量面板。
5. Field Watch 监听对象字段变化(对象断点)
右键类行左侧断点图标 → Object Breakpoints 监控对象所有字段读写,只要任何地方修改这个对象的属性,自动断住。 适用:DTO / 实体属性莫名被篡改,找不到赋值位置。
6. Exception Breakpoints 全局异常断点(不用 try-catch)
Debug 面板左侧「+」→ Java Exception Breakpoints 填入 java.lang.Exception,任何未捕获异常直接断在抛出位置,不用到处打断点找空指针、数组越界。 细分:可以只监听自定义业务异常 BusinessException。
7. Log Point 日志断点(不暂停、只打印)
右键断点 → 取消勾选 Suspend,填入打印内容:
用户ID:{user.id}, 名称:{user.username}
程序正常运行,控制台输出日志,不会卡住流程,替代临时 System.out 打印,调试完不用删代码。
8. Hot Swap 热替换(配合 Debug)
开启 IDEA 自动编译,断点状态下修改方法内代码: Ctrl+F9 重新编译,不用重启容器,配合 Drop Frame 直接跑新逻辑,快速试错。
9. Show Object Address 查看对象内存地址
变量右键 → Show Object Address 判断两个对象是否为同一个引用(== 对比底层依据),排查缓存、对象复用问题。
10. Class Loader 查看当前类加载器
Evaluate 表达式执行:
this.getClass().getClassLoader();
排查类冲突、热部署、双亲委派加载异常。
四、特殊场景:调试中创建对象的限制与避坑
- 无法 new 带动态代理的 Bean(@Service、@Mapper): Evaluate new UserService () 只会创建原生对象,无 AOP、事务代理; 解决:如果当前上下文持有 Bean 变量,直接调用原有 Bean,不要 new。
- 基本类型包装类直接创建无压力,DTO/POJO 普通实体完全支持。
- 调试中 new 的对象仅存在当前调试上下文,方法结束自动销毁,不会污染程序内存。
- 多线程断点:其他线程不会感知你临时创建的对象,仅当前栈帧生效。
五、速记总结(面试背诵版)
1. 调试动态创建对象核心工具
Evaluate Expression(Alt+F8):支持 new 任意实体、调用方法、修改变量、多行代码片段。
2. 四大改变执行流程神器
- Drop Frame:回退方法,重新执行
- Force Return:强制自定义返回值,跳过后续代码
- Throw Exception:手动抛出异常测试捕获逻辑
- Conditional Breakpoint:条件断点,精准拦截目标数据
3. 冷门超强调试功能清单
- Stream Trace:可视化调试流式代码
- Object Breakpoints:监听对象字段修改
- Exception Breakpoints:全局捕获所有异常
- Log Point:无暂停日志断点,替代临时打印
- Watch 持久监视表达式、Show Object Address 判断引用
- Inline Debugger 行内变量提示
- Hot Swap 热更新代码配合调试
实用高阶技巧&spm=1001.2101.3001.5002&articleId=162104217&d=1&t=3&u=7fd5a09d80c04faba00a42e19bc24b91)
3510

被折叠的 条评论
为什么被折叠?



