IntelliJ IDEA 2025.3 Help

修改程序的执行流程

调试应用程序时,您通常会遵循程序的正常流程。 然而,有时您需要偏离它。

这可能是为了重现某些条件或测试程序如何处理特殊情况,例如 null 或异常。 此外,当您需要跳过与当前正在检查的问题无关的特定部分时,这也很方便。

返回到先前的堆栈帧

IntelliJ IDEA 使您可以在程序执行流程中回退到前一个堆栈帧。 例如,如果您不小心走得太远并希望重新进入错过关键点的方法,这会很有用。

  • 在 线程 选项卡中,将鼠标悬停在您想要重置的帧上,然后点击出现的 重置帧 按钮。

    线程选项卡中的重置帧按钮

使用断点表达式

为了更改程序的流程,您可以使用 非暂停断点 ,当命中时 评估表达式。 例如,当您想在调试过程中自动修改变量时,这很有用。

public class Demo { private static boolean readyToExit = false; private void printHello() { System.out.println("Hello"); readyToExit = true; } public static void main(String[] args) { Demo d = new Demo(); d.printHello(); // evaluate 'readyToExit = false' here if (!readyToExit) main(null); } }

在此示例中,将 readyToExit 重置为 false 会使 printHello 方法被反复执行,直到我们禁用重置断点为止。

此外,断点表达式可用于添加一些仅在调试期间使用的逻辑。

public class Demo { private static boolean addDebugLogic; public static void main(String[] args) { System.out.println("Hello"); if (addDebugLogic) new Debug().doSomething(); } } class Debug { void doSomething() { // code goes here } }

在上述示例中,您可以使用断点更改 addDebugLogic 标志的值,这反过来会添加所需的调试特定行为。

添加带有表达式的非暂停断点

  1. 在您希望修改程序状态的行 添加断点。

  2. 请前往 断点属性。

  3. 在新断点的属性中,清除 挂起 复选框,并在 评估并记录 字段中输入将修改程序状态的表达式。

从当前方法强制返回

您可以在到达 return 语句之前退出方法,并使其返回任意值。 当问题与方法的返回值相关而不是与其产生方式相关时,这很有用。 强制返回 帮助您测试程序如何处理返回值,而无需重现导致这些返回值的条件。

当您使用 强制返回 时,当前执行点之后的指令将被忽略。

  1. 确保在 帧 选项卡中选中了当前方法,然后在该选项卡的任意位置右键点击并选择 强制返回。

    强制返回菜单项
  2. 如果方法返回一个值(其返回类型不是 void ),请指定该值或将计算该值的表达式。

    返回值对话框

    表达式在本地上下文中进行求值,并且可以使用已经声明的任何本地变量。 返回值必须符合方法的返回类型。

  3. 如果执行点当前位于 try、 catch 或 finally 块中,且 finally 中有未执行的代码行,请选择您是否要跳过它们。

    对话框询问您是否要在 finally 中执行代码

抛出一个异常

IntelliJ IDEA 允许您从当前执行的方法抛出异常或错误。 当您希望测试特定类型的异常如何被处理,而无需重现原因或修改代码时,这很有用。

  1. 在 帧 选项卡中选择当前方法,然后右键点击选项卡中的任意位置并选择 抛出异常。

    抛出异常菜单项
  2. 创建异常(这可以是任何 Throwable ,包括 Error 和方法未处理的检查异常)。 不要在表达式中使用 throw 关键字,例如: new NullPointerException()

    抛出异常对话框

重新加载修改的类

当您对代码进行更改时,您可能希望立即查看它们在运行时的行为,而无需关闭进程。 HotSwap 机制允许您通过在调试会话期间重新加载更改的类来实现这一点。

重新加载所有更改的文件

  • 在编辑器中右键点击并选择 编译并重新加载修改后的文件。

  • 在 代码已更改 弹出窗口中点击 应用热交换。 这会在您调试时更改代码后出现。

    编辑器中的代码更改弹出窗口

如果在 重新加载类之前构建项目 中启用 设置 | 构建、执行、部署 | 调试器 | HotSwap 选项,则会自动重新编译。 否则,您需要在重新加载之前重新编译文件(构建 | 重新编译 Ctrl+Shift+F9)。

重新编译的范围取决于构建工具。 例如,Gradle 和 Maven 会重新编译整个模块,而 IntelliJ IDEA 的构建系统仅重新编译更改的文件。

重新加载单个更改的文件

  1. 按下 Ctrl+Shift+A。

  2. 在打开的 Search Everywhere对话框中,输入 Compile And Reload File ,选择相应的操作,然后按 Enter。

您可以使用 设置 | 构建、执行、部署 | 调试器 | HotSwap 中的 编译后重新加载类 选项配置类在重新编译后自动重新加载。 您可以打开/关闭自动重新加载,或配置调试器在每种特定情况下询问您是否重新加载文件。

HotSwap 限制

由于虚拟机设计,HotSwap 有以下限制:

  • 它仅在修改方法体时可用。 不支持更改签名。

  • 不支持添加和移除类成员

  • 如果修改的方法已经在调用栈中,变更将在程序退出修改的方法后生效。 在此之前,方法体保持不变。 在这种情况下,帧显示为 已过时。

如果您想要去除标准虚拟机施加的限制,您可以使用 Dynamic Code Evolution VM,它支持在运行时无限制地重载类。

2026年 1月 23日