写代码时遇到 bug,光靠 print 大法?太慢了。改一行、运行一次、再改、再运行……来回折腾十几遍,问题还在那儿笑嘻嘻。其实,IDE 里藏着一对黄金搭档——单步执行和断点,用好了,定位问题快得像拿放大镜找蚂蚁。
断点:让程序在你想停的地方停下
断点不是暂停键,是“精准拦截点”。比如你在处理用户登录逻辑,怀疑密码校验那块出了问题,直接在 if (checkPassword(input)) 这行左边点一下,出现红点——断点就设好了。下次运行,程序走到这儿自动暂停,变量值、调用栈、当前线程全摊开在你眼前。
单步执行:一帧一帧看清代码怎么跑
停住之后别急着狂按 F5 继续。试试 F7(步入)、F8(步过)、F9(继续):
- F7(步入):钻进函数内部,比如
checkPassword()里有三行判断,你想看每一步怎么走,就用它; - F8(步过):把当前这行当黑盒,执行完直接跳到下一行,适合跳过确定没问题的工具函数;
- F9(继续):回到上次断点,或者跑到下一个断点。
举个实际例子:一段解析 JSON 的代码老是报空指针,你在 JSONObject obj = new JSONObject(jsonStr) 设断点,F7 步入后发现 jsonStr 居然是 null——问题当场锁定,不用再猜是哪一层传错了。
真·结合用法:边走边查,边查边调
光设一个断点不够?加多个。比如循环处理 100 条订单数据,第 47 条出错。你可以在循环开头设断点,按 F8 走 46 次,太累?那就配合条件断点:右键断点 → 编辑 → 填上 i == 47。程序只在第 47 次循环暂停,立马开查 order.getAmount() 返回啥、有没有被清空。
再比如异步回调里变量莫名被改,你在回调方法入口打个断点,F7 步入,接着用 F8 逐行观察对象状态变化,甚至能看着某个字段从 "pending" 变成 "failed" 的全过程。
小提醒:别忘了“变量窗口”和“表达式求值”
暂停时,别只盯着代码。右侧变量窗口里鼠标悬停就能看值;想临时算个表达式?比如 list.size() > 0 && list.get(0).isValid(),直接在调试控制台敲进去回车,立刻出结果——比改代码再跑一遍快十倍。
调试不是玄学,是手艺活。断点定位置,单步控节奏,两者咬合起来,代码里的猫腻根本藏不住。