Java 调试(IDEA Debug)实用高阶技巧

分两大块:调试时动态创建对象 / 调用方法 + 冷门但超强的调试功能,全部实战可用,面试、排错高频神器。

一、Debug 控制台动态生成对象、执行代码(最核心需求)

IDEA Debug 提供 Evaluate Expression(计算表达式),断点停下后直接写 Java 代码,临时创建对象、调用方法、修改变量。

1. 调出面板三种方式

  1. 断点暂停后:Alt + F8(Windows)/ Option + F8(Mac)
  2. 右键 → Evaluate Expression
  3. 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();

排查类冲突、热部署、双亲委派加载异常。

四、特殊场景:调试中创建对象的限制与避坑

  1. 无法 new 带动态代理的 Bean(@Service、@Mapper): Evaluate new UserService () 只会创建原生对象,无 AOP、事务代理; 解决:如果当前上下文持有 Bean 变量,直接调用原有 Bean,不要 new。
  2. 基本类型包装类直接创建无压力,DTO/POJO 普通实体完全支持。
  3. 调试中 new 的对象仅存在当前调试上下文,方法结束自动销毁,不会污染程序内存。
  4. 多线程断点:其他线程不会感知你临时创建的对象,仅当前栈帧生效。

五、速记总结(面试背诵版)

1. 调试动态创建对象核心工具

Evaluate Expression(Alt+F8):支持 new 任意实体、调用方法、修改变量、多行代码片段。

2. 四大改变执行流程神器

  1. Drop Frame:回退方法,重新执行
  2. Force Return:强制自定义返回值,跳过后续代码
  3. Throw Exception:手动抛出异常测试捕获逻辑
  4. Conditional Breakpoint:条件断点,精准拦截目标数据

3. 冷门超强调试功能清单

  1. Stream Trace:可视化调试流式代码
  2. Object Breakpoints:监听对象字段修改
  3. Exception Breakpoints:全局捕获所有异常
  4. Log Point:无暂停日志断点,替代临时打印
  5. Watch 持久监视表达式、Show Object Address 判断引用
  6. Inline Debugger 行内变量提示
  7. Hot Swap 热更新代码配合调试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值