做Java开发这些年,被问到最多的问题之一就是IDEA怎么用。Debug调试是不是顺手,快捷键敲得够不够流畅,直接决定了一天有效编码时间有多少。很多刚入行的同学,或者从Eclipse切过来的老手,头一两个月基本都在跟IDEA较劲:断点不生效、调试按钮不知道干嘛的、想重命名一个变量还在用鼠标慢慢点。这篇文章不聊虚的,把我日常每天都在用的IDEA核心用法完整过一遍,重点放在Debug流程和常用快捷键上,顺便把环境初始化、断点原理、常见坑一次讲透。无论你是刚装好IDEA的新手,还是用了几年但一直靠鼠标点来点去的“伪熟练工”,这篇都值得花二十分钟认真走一遍。
1. 整体设计与思路拆解
1.1 IDEA版本选择与安装
先说版本。IDEA分Ultimate终极版和Community社区版,很多初学者上来就纠结。社区版免费、开源,日常写Java、Spring Boot、Maven项目完全够用,唯一的硬伤是不直接支持Spring Initializr、数据库工具、部分Web开发插件,但调试、重构、Git这些核心能力一个不少。我的建议是先用社区版把基础打牢,如果后续确实需要Spring生态的一键集成,再考虑正经渠道的Ultimate授权。IDEA有官方中文设置入口,安装界面选简体中文即可,没有历史包袱的建议直接用默认配置跑起来。
安装过程没什么特别的,Windows下注意两点:一是安装路径别带中文和空格,否则偶尔会引发奇怪的路径问题;二是如果机器内存充足,把启动的堆内存适当调大一点,后面编译大项目会明显更顺畅。具体做法是在Help -> Change Memory Settings里调整,一般建议至少2G。安装完成后先别急着写代码,花五分钟把下面这几项基础配置好,后面能省下无数麻烦。
1.2 界面布局与项目结构认知
IDEA默认的界面布局是左边项目树、中间编辑器、右边Maven和数据库工具窗格。刚上手的人最容易懵的是“我的类怎么找不到了”“这个窗格是什么时候打开的”,其实IDE的布局逻辑就是围绕Project窗格和编辑器这两个核心转。左侧Project窗格里,最好把查看模式切到Project而不是Android或Packages,这样能看到纯Java目录结构,理解和操作起来更直观。
另一个容易被忽略的是IDEA的多窗口和拆窗功能。在编辑器标签页上右键可以Split Right或Split Down,调试时候一边打开源码、一边打开子类实现,对比看非常方便。还有一点,IDEA默认会折叠空包、自动把相似文件分组,如果你的项目结构比较特殊,建议在Project窗格的设置里取消勾选Compact Middle Packages,避免明明建了包却看不到目录层级。
1.3 核心配置:JDK、Maven与编译级别
环境配置这块,先保证JDK路径正确。打开File -> Project Structure -> Project,把Project SDK选成你本地的JDK版本,Language Level跟SDK保持一致即可。这里有个容易踩的坑:Language Level选择过低,代码里用了新语法(比如var)就会爆红;选择过高,配合低版本编译插件又会编译失败。最稳妥的做法是SDK和Language Level都用你项目实际需要的版本,别贪新。
Maven配置是很多新手“爆红”的重灾区。IDEA自带Maven,但国内网络环境下下载依赖经常卡住,最好用自己本地的Maven并配置国内镜像。在File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven里,指定Maven home path、Settings file(建议指向你的settings.xml)和Local repository目录。改完配置后右键项目根目录的pom.xml,选择“Maven -> Reload project”,依赖才会真正拉取下来。编译级别同理,最好在maven-compiler-plugin里显式声明,否则IDEA内的编译级别和命令行打包的编译级别不一致,很容易出现“IDE能跑、一打包就报错”的割裂现象。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Debug流程与核心调试原理
2.1 调试入口与断点到底打在什么地方
Debug不是“点了虫子图标就开始”这么简单。整个调试过程可以拆成三步:设置断点、触发断点、观察与控制执行。断点是最核心的概念,它好比你在代码执行的“关键路口”设了一个路障,程序跑到这里会停下来等你审讯。IDEA里设置断点的最简单方法就是在行号右侧的灰色区域点一下,出现红色圆点就表示断点打好了;再点一下取消。这个操作对应运行前的准备阶段,也可以直接用快捷键Ctrl+F8。
但断点不是随便乱打的。调试的目的是确认数据和执行流,你最好打在三种位置:一是方法入口处,适用于排查某个函数的入参是否正常;二是关键计算语句行,比如排序、转换、写入前,确认数据在每一步变化前后的值;三是条件分支和循环内部,用于检查为什么走了某个分支、循环第几次出错。打在空行、注释、方法签名或者声明语句上是无效的,程序根本不会停下来。实际工作中我见过太多人把断点打在import行或者类声明上,然后问我为什么启动的时候没反应,那肯定没反应。
2.2 八步调试指令逐一点评
当程序在断点处暂停后,Debug窗口会亮起一排调试控制按钮。国内很多教程把这排按钮的名字列出来就完了,但我觉得还是把每个按钮的实际使用场景讲清楚,比死记硬背强得多。
- Step Over(F8):单步执行,执行当前行的代码,直接跳到下一行,但不会进入方法内部。这是最常用的按钮,适合从头到尾走一遍主流程,不关心内部实现细节。
- Step Into(F7):步入方法内部。当你需要跟进当前行调用的方法体时用这个。注意IDEA默认只会进入你自己项目的代码,第三方库方法默认被过滤掉,这其实是个好特性,不然一点F7就掉进JDK源码出不来的体验太糟糕了。
- Force Step Into(Alt+Shift+F7):强制步入。如果某些第三方库或者系统方法被过滤了,但你就是想进去看看实现,用这个能强行钻进去。比如排查JDK的HashMap扩容逻辑的时候用得上。
- Step Out(Shift+F8):步出方法。当前在方法体内部,你想直接跑完这个方法、回到上层调用点,就按这个。特别适合你已经找到问题所在,不用再一行行细看的时候。
- Drop Frame:回退帧。这个按钮很有特色,它能让你退回到当前调用栈最顶部方法的起点,相当于“回放”当前方法的执行过程,但注意变量的修改不会自动回滚,只用于调整执行到更早的语句。我调复杂递归的时候会用到它来重新走一遍关键分支。
- Run to Cursor(Alt+F9):运行到光标处。鼠标定位到某一行代码,点这个就能快速从当前暂停位置直接跳到你指定的那一行,中间会正常执行而不再逐行停下。排查日志中间输出位置比狂按F8高效太多。
- Evaluate Expression(Alt+F8):表达式求值。在暂停状态下输入任意表达式,比如
user.getName()或者list.size(),立即能看到运行结果,甚至可以调用方法,是调试时最强大的“计算器”。 - Trace Current Stream Chain:跟踪当前流链。Java的Stream链式操作在调试时特别不友好,用这个功能可以把map、filter中间态展开,一行一步看数据流经每个阶段的元素变化。排查Stream相关的bug时非常香。
这八个按钮我用得最多的是F8、F7和Run to Cursor,三个配合基本能解决八成调试问题。剩下的Evaluate Expression在计算复杂判断时几乎必不可少,建议所有人都练熟。
2.3 调用栈、变量监控与表达式求值
程序停在断点处后,Debugger窗格分几个区域,很多人只看变量区,忽略调用栈和线程状态,这是不对的。最上面是Frames(调用栈),展示从启动线程到当前方法的一层层调用链,每一行都会显示类名、方法名、行号。排查异常时,调用栈是整条案发现场最直接的路线图,你顺着栈从下往上翻,就能看到是哪个入口通过什么路径调到了出问题的地方。
IDEA的调用栈还有个很实用的筛选框,在栈顶有个搜索图标,输入关键字可以只显示匹配的方法,这在处理几十层嵌套的大项目时能救命。栈下方是Variables窗口,以树形结构展示当前作用域内所有变量。这里有个小技巧:在变量上右键选择Set Value,可以直接修改变量的值。调试时可以故意把某个入参改成异常值,看看后面的逻辑会不会出错,用来验证各种边界条件。我经常在改完值之后重跑分支,几秒钟就能试出一种边界情况的处理逻辑,效率比改代码重新部署高得多。
如果Variables里的变量太多,或者你想追踪某个对象在不同断点的统一变化,就把它添加到Watches窗口。右键变量选择Add to Watches,之后切换断点时,监视窗口会持续跟踪这个变量的状态,你就能看到它在整个执行过程中的演变轨迹。
2.4 条件断点与异常断点
实际业务代码里,循环1000次、集合里有几千条数据,你不可能一条条跑完。这时就得用条件断点。在断点的红色圆点上右键,输入条件表达式,比如i == 500 && list.get(i).getStatus() == 2,程序只有在满足条件时才会停下来。IDEA的条件断点使用的是当前上下文的表达式语法,可以直接引用变量和方法,支持常见的比较和逻辑运算。挂上条件后断点上会显示一个问号标记,程序命中时再点亮,调试性能会有一点损耗,但基本可以忽略。
异常断点也是极其有用的调试工具,能帮你在异常抛出的第一现场停下来,而不是等着程序崩溃后在日志里大海捞针。在Debug窗口左侧点View Breakpoints,或者按Ctrl+Shift+F8,打开断点管理界面,点击加号选择Java Exception Breakpoints,输入你要拦截的异常类型,比如NullPointerException或者自定义的BizException。这样一旦代码里抛出该异常,IDE会立刻停在抛出位置,精确到哪一行。尤其适合排查那种“某处有空指针、但不知道在哪”的玄学问题,比一遍遍看日志快一个量级。
3. 常用快捷键系统梳理
3.1 编辑类快捷键:高频操作一次到位
快捷键是IDEA使用舒适度的核心分水岭。不用记几百个,把下面这组高频的在肌肉里记清楚,工作效率立刻上一个档次。
Ctrl+W:选中光标所在的词,再按一次扩大选中范围(代码块),是IDEA里最值得练的键之一。Ctrl+D:复制当前行到下一行。以前用Eclipse的人总是Ctrl+C、回车、Ctrl+V三连击,在IDEA里一个Ctrl+D就完事。Ctrl+Y:删除当前行,不用先选中。Ctrl+/和Ctrl+Shift+/:分别为行注释和块注释,后者可以直接给一段代码打上/ */注释。Alt+Enter:万能修复键。代码报错、爆红、提示优化时,按它会弹出可执行的操作列表,比如自动导包、生成局部变量、切换lambda和循环写法、快速扔异常。这是IDEA最魔性的键之一,代码标红时第一反应就该是Alt+Enter。Ctrl+Alt+L:格式化代码,让混乱的缩进和对齐一次性归位。Ctrl+Alt+O:优化导入,清除没用到的import。Shift+F6:重命名,变量、方法、类都能安全重构,项目内引用会全部同步更新。这是我最依赖的重构快捷键,比手动全局替换靠谱得多。Ctrl+Alt+M:抽取方法。把一段逻辑选中,直接抽成一个独立方法,IDEA会智能分析参数和返回值。老代码重构时这个键能帮你快速理清函数结构。Ctrl+P:查看方法参数提示,调用一个记不清楚参数顺序的方法时,光标停在括号里按一下就能看到完整签名。
这些编辑类快捷键里,Alt+Enter和Shift+F6是我认为性价比最高的两个,几乎每天用几十次。掌握它们之后,你会发现写代码能持续保持“手不离键盘”的状态,思维不被打断。
3.2 搜索定位类快捷键:快速找到你要的代码
项目大了以后,找代码比写代码更频繁。IDEA的搜索定位做得非常强,关键是记几条入口。
Shift+Shift:全局搜索,可以搜类、文件、方法、配置项,甚至操作按钮。这个双Shift弹出的Search Everywhere是统合的搜索入口,几乎所有找不到的东西都可以从它入手。在调试时想快速跳到某个类、某个断点、某个收藏项,按两下Shift输入关键字即可。Ctrl+N:按类名快速查找类。只需要输入类名的缩写,比如输入StrU就能搜到StringUtils,不要求全拼。Ctrl+Shift+N:按文件名查找文件,适合找配置文件、XML、yml。Ctrl+Alt+Shift+N:全局按方法名或变量名搜索,跨文件找某个service方法时很有用。Ctrl+F/Ctrl+Shift+F:当前文件搜索/全局搜索文本。全局搜索里可以限定文件类型、范围,比如只搜Java文件里包含“orderId”的内容。注意Ctrl+Shift+F的搜索范围默认是Project,如果只想搜某个子模块,可以先选中目录再按。Ctrl+E:最近打开的文件列表。在频繁切换的几类文件之间来回跳转时,比去左侧目录里翻快得多。F4:跳到当前选中的类或方法定义处。Ctrl+B:跳到方法定义处;Ctrl+Alt+B:跳到实现类,在接口方法上按这个就能直接看到所有实现。Ctrl+F12:当前类的所有方法列表弹窗,输入关键字快速定位方法,适合一头扎进大工具类时快速浏览结构。Alt+F7:查找所有引用,看某个方法、变量在工程里所有被使用的位置,排查改动影响范围时必用。
这些搜索快捷键的核心逻辑是“尽量不脱离键盘完成文件与代码导航”。如果连类都找不到,Debug的第一步就卡住了,所以我把搜索定位放在快捷键章节的第二个位置讲。
3.3 代码生成与重构快捷键
除了编辑和搜索,IDEA还能帮你自动生成模板代码,这类快捷键对减少重复劳动格外有效。
psvm+ Tab:生成main方法。类似地还有sout生成println、psfs生成public static final String常量、fori生成倒序for循环、iter生成foreach循环。这是IDEA最有特色的“Live Templates”,熟悉后写样板代码的手速能提高一半。Alt+Insert:生成器,自动生成构造器、getter/setter、equals/hashCode、toString方法。在实体类里按一下,勾选要生成的字段即可。Ctrl+J:插入现有模板,比如代码块、日志定义、文件注释等,适用场景比Alt+Insert更广。Ctrl+Alt+T:用选中的代码包成try-catch、if、for等结构。写一段临时逻辑后想加异常处理时,选中代码按这个键快速包裹起来。Ctrl+Alt+V:把任意表达式赋值给变量,比如把一串方法和常量计算结果提取成一个局部变量。Ctrl+Alt+F:把一个局部变量提升为类字段,常用于重构时把某个反复计算的值提到类维度缓存。Ctrl+Alt+C:把一个常量提取成静态常量。Ctrl+Alt+P:把方法里反复使用的参数对象提取为方法参数。
重构类快捷键不要试图一次记住,最有效的方法是先从Alt+Enter、Shift+F6、Ctrl+Alt+M这三个开始,等形成条件反射了,再去尝试Ctrl+Alt+V和Ctrl+Alt+F。
3.4 调试类快捷键与断点管理
调试的时候,快捷键直接决定你能不能在限速芯片上跳出流畅的舞步。除了前面讲过的F8、F7、F9、Shift+F8,还有几个跟调试强相关的键。
Ctrl+F8:切换/取消断点。Ctrl+Shift+F8:查看所有断点、条件断点、异常断点统一管理。F9:恢复程序继续运行,直到下一个断点或程序结束。在多个断点之间快速跳跃时是主力键。Alt+F10:跳到当前执行点,当你切到别的类后想马上回到程序暂停的那一行,按这个立即跳回。Ctrl+Shift+F10:运行当前类的主方法,或者运行当前测试方法。Shift+F10:重新运行当前配置,调试修改完代码后,不用鼠标点绿色箭头,直接按这个。
我记得刚带团队那会儿,要求新人必须做到“Debugg时手不能离开键盘区域”,就是靠这几个快捷键。用鼠标在IDE上找按钮的时间看起来不多,但一天调试几十次,累积起来相当可观。
3.5 自定义快捷键方案与键位冲突处理
很多人会忽略IDEA快捷键是可以整体换肤的。如果你从Eclipse转过来,长时间适应不了IDEA默认键位,完全可以直接在Settings -> Keymap里把方案切到Eclipse,瞬间无缝衔接。这个功能帮过不少从Eclipse过来的老同事,减少了很多学习成本。
如果某个快捷键跟输入法或系统软件冲突,比如截图工具、系统切换输入法会占用Ctrl+Space这类组合键,可以在Keymap里搜索对应操作,右键选择Add Keyboard Shortcut重新指定。我个人的经验是Ctrl+Space(代码补全)是最容易跟输入法冲突的键位,真冲突的话可以换成Ctrl+Alt+Space或者Alt+/,用半天就能习惯。还有一点,快捷键在某些操作系统上会有差异,Windows和macOS很多键位不一样(比如Windows的Ctrl对应macOS的Command),如果你在多个系统间切换,可以在Keymap里用预设的Mac OS X方案,不要硬背一套。
4. 实操过程与核心环节实现
4.1 从零启动一个可调试项目的配置流程
假设你刚装完IDEA,手里有一个订单服务的Spring Boot项目,完整跑起来并进入可调试状态需要做几步。第一步,按File -> Open打开项目根目录,等IDEA自动识别Maven或Gradle。识别完成后右下角会弹出一个提示框,问是否信任项目,选择Trust Project。如果这个项目没有pom.xml,IDEA会把它识别成普通文件夹,这时候可以在项目根目录右键,选择Add Framework Support,手动挂上Maven。核心是让IDE意识到这是一个构建型项目,而不是一堆散落的Java文件。
第二步,配置运行环境。打开Run/Debug Configurations,点左上角加号,选择Spring Boot,Main class要指定到启动类,比如OrderApplication。如果项目不是Spring Boot而是普通Java程序,就选择Application类型,Main class填带main方法的类。配置好之后,右上角会多出一个可运行的绿色三角,旁边是Debug虫子图标。建议把工作目录设成模块根目录,避免相对路径的文件读取失败。
第三步,验证Debug可用性。先在启动类的第一行打个断点,然后点Debug。如果程序能正常停到断点位置,说明整个链路是通的。启动阶段出现端口占用、找不到主类、Maven依赖缺失这些情况,都可以在前面配置章节提到的设置项里找原因。核心原则是先保证编译和构建绿色通过,再谈调试。
4.2 一次完整Debug的现场记录
我举一个真实排查过的例子来串一遍完整Debug流程。当时有个接口偶尔会返回金额算错,表现为订单总金额比明细加起来少。我先用浏览器调用接口复现,然后在金额汇总循环那行打了一个条件断点,条件是i > 600,因为大概第600条明细之后才会错。启动Debug模式,重新调用接口,当循环跑到第601次时程序停住了,Variables里很明显能看到金额累加时有一个变量被意外清零了。
我顺着调用栈往上翻,发现这个变量在某个分支里被重新赋值了,而且在循环之前和循环中途是两个不同的对象。这时候我右键这个变量,选Evaluate Expression,输入了detail.getAmount() == null ? BigDecimal.ZERO : detail.getAmount()和原始的累加语句,分别计算了一下,马上定位到是巧妙的“空值被当零,但累加时前者被置为NULL”判断逻辑问题。接着我在出错的if分支也加了断点,用Run to Cursor跳到分支末尾,通过Step Over从头到尾又走了一遍,确认是条件写反了导致一笔金额直接被覆盖。
整个排查过程大概十分钟,大部分时间花在观察变量上。如果没有条件断点和Evaluate Expression,靠日志打印至少要来回部署三轮,耗时半小时以上。这就是为什么我一直强调调试工具链要熟练——它把“猜测-验证”的循环压缩到几秒钟。
4.3 多模块项目的调试与日志配合
多模块项目的调试有几个特殊点。首先断点要打对模块,如果A模块调用B模块,你在B模块的类里打了断点,启动A模块时必须确保B模块是以Debug模式编译且依赖的是本地优先版本,否则断点可能默认穿透。可以在Project Structure的Modules里检查每个模块的编译输出目录,以及Maven是否把依赖配成了SNAPSHOT本地版本。
其次,多模块项目的调用链往往跨好几个Service,单纯靠Frames栈翻起来会很累。这时可以配合日志输出,在关键Method入口里临时加一行System.out.println或者log.info,加上方法名和核心参数,跑一次后直接用日志把整条链路串起来。日志不是Debug的替代品,它是Debug的“路书”。什么时候应该先看日志再Debug?我一般结合规则:程序崩溃有堆栈,先看日志定位到类和方法,再在那个方法里打断点精细排查;如果连日志都没有,就先在入口方法加日志,再决定断点打哪。
还有一点,多模块Debug时最容易遇到的是“多个同名断点”,比如好几个微服务都有UserService。这时在断点管理面板里选择Group by Package,或者直接给断点写备注说明用途,就不会混淆了。断点太多且忘记自己设了哪些时,Ctrl+Shift+F8一口气全部查看清理,也是很重要的习惯。
5. 常见问题与排查技巧实录
5.1 断点不生效的几种原因及查法
断点不生效是Debug路上最烦的问题,多数情况下不是程序没到,而是IDEA的“某个开关”没打开。最常见的三种原因:一是编译方式不对,断点打的代码和运行的程序不是同一份代码,比如Maven使用了远程依赖而本地代码改了没有重新打包,或者项目设置了增量编译但输出目录没更新。解决办法是Build -> Rebuild Project强制全量编译,或者把Maven分组里的“打包跳过测试”关掉。二是Debug图标没开成Debug模式,误用Run启动那当然不会停到断点,运行按钮左侧的图标如果是绿色三角而不是小虫子,就说明当前是运行模式。三是断点打在无效位置,比如接口方法上、抽象方法上、枚举值声明上,这类代码没有可执行指令,不会触发断点。
还有一个更隐藏的坑:多个JVM进程。比如用远程Debug连接了端口,但本地IDEA同时开着多个进程,断点只对当前选中的进程有效。排查时,在Debug窗口的进程下拉框里确认当前进程是不是你关心的那一个。最后,热部署类工具(如JRebel)也可能导致断点失效,因为它动态重载的是另一份字节码,和Debugger的不一致。遇到这类神鬼现象,先停掉热部署插件,再用原生Debug试一次。
5.2 Debug启动慢与多线程调试
项目启动时Debug模式比Run模式慢,是因为JVM开启了调试监听,要等调试器附着,这个过程在代码量大、断点多的项目里尤其明显。处理方法是减少用不到的条件断点,调试完及时在断点管理面板里把断点清掉;或者使用“共享内存”而不是“Socket”的调试模式,在Debug配置里勾选Shared memory,Windows下能快一点。另外,启动类本身如果不影响调试,可以把Main方法的断点放在真正需要关注的方法上,不要无脑在第一行打断点,否则启动时会在初始化流程里反复暂停。
多线程调试时要特别注意“当前线程”的概念。在Frames窗口里,每个线程有自己的栈,Wayne的按钮只能操作当前线程。调试并发问题时,先选中正在运行的目标线程,再按暂停,否则你暂停的可能是垃圾回收线程。另一个技巧是给线程设置过滤条件,在断点的Suspend策略里选择Thread而不是All,这样线程A停在断点时,线程B可以继续运行,避免所有线程互相阻塞导致死锁假象。排查并发bug时这个策略几乎是必备。
5.3 日常高频问题速查表
我整理了一份Debug使用中出现频次最高的问题速查表,强烈建议收藏,以后遇到状况直接对照来。
| 症状 | 可能原因 | 快速处理办法 |
|---|---|---|
| 断点不生效 | 编译输出与源码不一致 | Rebuild Project,重新Debug |
| 断点不生效 | 以Run模式而非Debug模式启动 | 切换为Debug图标启动 |
| 断点不生效 | 断点在无效行(方法签名、空行) | 将断点移到可执行代码行 |
| 断点不生效 | 远程调试端口连接失败 | 检查远程JVM启动参数和防火墙 |
| 程序暂停后无法继续 | 同时挂了多个线程互相等待 | 切换到相关线程,检查锁状态 |
| 变量值不更新 | Drop Frame后变量未回滚 | 手动Set Value或重新运行 |
| 条件断点不触发 | 条件表达式语法错误或变量不存在 | 在Evaluate Expression里先验证表达式 |
| 修改代码后断点仍执行旧逻辑 | 热部署导致字节码不一致 | 停止并重新Debug一次 |
| 每次断点都进入JDK源码 | 未开启自动过滤第三方库 | Settings里打开Show Only Non-Packaged Classes过滤 |
| Debug启动特别慢 | 断点过多或内存配置不足 | 清理断点数,提高堆内存,使用共享内存模式 |
这张表里的每个条目都是我实际和同事同事讨论或自己踩坑后总结出来的。Debug类问题的共性规律就一条:先确认实际运行代码是不是你看到的代码,再确认断点条件本身是不是正确的。顺着这两个方向排查,90%的怪异现象都能快速解释。
5.4 提高Debug效率的独家技巧
最后分享三个不太常见但非常有效的Debug小技巧。第一个是在调试过程中快速修改代码而不重启:如果你用Java 8以上,并且开启了HotSwap功能,修改方法体内部逻辑后用Ctrl+F9重新编译当前文件,JVM会直接热替换字节码,断点处你都可以“在线”改完逻辑继续调试,不用重启整个应用。但这只对方法内的改动有效,新增方法、修改类签名这种改动还是需要重启。
第二个技巧是使用“临时断点”。按住Alt键点击左侧断点位置,会创建一个只执行一次的临时断点,命中后自动消失。当你只想在某个循环的特定位置停一次时,这个比手动取消断点快得多。我喜欢在做一次性验证时用临时断点,跑完就没了,不用记着回头清理。
第三个是善用File -> Settings里的“Live Templates”,把你常用的调试模板做成快捷键组合。比如我定义了一个if (log.isDebugEnabled()) { log.debug("xxx=" + xxx); }的模板,输入tlog加Tab就能展开。调试时能少敲代码就少敲,键盘操作的连贯性一旦被打断,思路也会跟着断。工具这玩意儿,本质上就是熟能生巧,Debug用顺了就再也回不去“System.out.println走天下”的时代了。
