修改程序的执行流程
调试应用程序时,您通常会遵循程序的正常流程。 然而,有时您需要偏离它。
这可能是为了重现某些条件或测试程序如何处理特殊情况,例如 null 或异常。 此外,当您需要跳过与当前正在检查的问题无关的特定部分时,这也很方便。
返回到先前的堆栈帧
IntelliJ IDEA 使您可以在程序执行流程中回退到前一个堆栈帧。 例如,如果您不小心走得太远并希望重新进入错过关键点的方法,这会很有用。
在 线程 选项卡中,将鼠标悬停在要重置的帧上,然后点击出现的 重置帧 按钮。

使用断点表达式
为了更改程序的流程,您可以使用 非暂停断点 ,当命中时 评估表达式。 例如,当您想在调试过程中自动修改变量时,这很有用。
在此示例中,将 readyToExit 重置为 false 会使 printHello 方法被反复执行,直到我们禁用重置断点为止。
此外,断点表达式可用于添加一些仅在调试期间使用的逻辑。
在上面的示例中,可以使用断点更改 addDebugLogic 标志的值,从而添加所需的调试专用行为。
添加带有表达式的非暂停断点
从当前方法强制返回
您可以在到达 return 语句之前退出方法,并使其返回任意值。 当问题与方法的返回值相关而不是与其产生方式相关时,这很有用。 强制返回 帮助您测试程序如何处理返回值,而无需重现导致这些返回值的条件。
当您使用 强制返回 时,当前执行点之后的指令将被忽略。
确保在 帧 选项卡上选中当前方法,然后右键点击该选项卡中的任意位置并选择 强制返回。

如果方法返回一个值(其返回类型不是
void),请指定该值或将计算该值的表达式。
表达式在本地上下文中进行求值,并且可以使用已经声明的任何本地变量。 返回值必须符合方法的返回类型。
如果执行点当前位于
try、catch或finally块中,且finally中有未执行的代码行,请选择您是否要跳过它们。
抛出一个异常
IntelliJ IDEA 允许您从当前执行的方法抛出异常或错误。 当您希望测试特定类型的异常如何被处理,而无需重现原因或修改代码时,这很有用。
在 帧 选项卡上选择当前方法,然后右键点击该选项卡中的任意位置并选择 抛出异常。

创建异常(这可以是任何
Throwable,包括错误和方法未处理的检查异常)。 不要在表达式中使用抛出关键字,例如:new NullPointerException()
重新加载修改的类
当您对代码进行更改时,可能希望立即查看它们在运行时的行为,而无需关闭进程。 HotSwap 机制允许通过重新加载调试会话期间更改的类来实现这一点。
重新加载所有更改的文件
在编辑器中右键点击并选择 编译并重新加载修改后的文件。
在 代码已更改 弹出窗口中点击 应用热交换。 这会在您调试时更改代码后出现。

如果 IntelliJ IDEA 检测到 HotSwap 无法应用的更改,它会显示 重新启动调试
按钮,该按钮位于 代码已更改 弹出窗口中。 将鼠标悬停在该按钮上可查看检测到的更改,或点击该按钮以使用修改后的代码重新启动调试会话。 如需更多信息,请参阅 HotSwap 限制。
如果在 重新加载类之前构建项目 中启用 选项,则会自动重新编译。 否则,您需要在重新加载之前重新编译文件( Ctrl+Shift+F9)。
重新编译的范围取决于构建工具。 例如,Gradle 和 Maven 会重新编译整个模块,而 IntelliJ IDEA 的构建系统仅重新编译更改的文件。
重新加载单个更改的文件
按下 Ctrl+Shift+A。
在打开的 Search Everywhere对话框中,输入
编译并重新加载文件,选择相应的操作,然后按 Enter。
您可以使用 中的 编译后重新加载类 选项配置类在重新编译后自动重新加载。 您可以打开/关闭自动重新加载,或配置调试器在每种特定情况下询问您是否重新加载文件。
HotSwap 限制
由于虚拟机设计,HotSwap 有以下限制:
仅在修改方法体时可用。 不支持更改方法签名和返回值类型。
不支持添加和移除方法、字段和内部类。
不支持更改类种类、超类型、字段类型,以及类、方法和字段的修饰符。
添加 lambda 表达式或匿名类,或更改其捕获的变量,会更改类结构,因此不受支持。 在 Kotlin 中,这不适用于传递给内联函数的 lambda。
如果修改后的方法已在调用堆栈中,更改仅在程序退出修改后的方法后生效。 在此之前,方法体保持不变。 在这种情况下,帧显示为 已过时。
在调试会话期间修改 Java 或 Kotlin 代码时,IntelliJ IDEA 会根据这些限制检查更改。 如果更改无法重新加载,或文件包含语法错误,IDE 会建议重新启动调试会话,而不是应用 HotSwap。
如果要移除标准虚拟机施加的限制,可以使用 Dynamic Code Evolution VM (DCEVM),它无限制地支持在运行时重新加载类。 启用 DCEVM 后,IntelliJ IDEA 不会检查更改,并且始终建议 HotSwap。