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

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

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

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

如果在 重新加载类之前构建项目 中启用 选项,则会自动重新编译。 否则,您需要在重新加载之前重新编译文件( Ctrl+Shift+F9)。
重新编译的范围取决于构建工具。 例如,Gradle 和 Maven 会重新编译整个模块,而 IntelliJ IDEA 的构建系统仅重新编译更改的文件。
重新加载单个更改的文件
按下 Ctrl+Shift+A。
在打开的 Search Everywhere对话框中,输入
Compile And Reload File,选择相应的操作,然后按 Enter。
您可以使用 中的 编译后重新加载类 选项配置类在重新编译后自动重新加载。 您可以打开/关闭自动重新加载,或配置调试器在每种特定情况下询问您是否重新加载文件。
HotSwap 限制
由于虚拟机设计,HotSwap 有以下限制:
它仅在修改方法体时可用。 不支持更改签名。
不支持添加和移除类成员
如果修改的方法已经在调用栈中,变更将在程序退出修改的方法后生效。 在此之前,方法体保持不变。 在这种情况下,帧显示为 过时。
如果您想要去除标准虚拟机施加的限制,您可以使用 Dynamic Code Evolution VM,它支持在运行时无限制地重载类。