# 修改程序的执行流程

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com.cn/help/idea/llms.txt).

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

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

## 返回到先前的堆栈帧

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

Procedure:

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

![线程选项卡中的重置帧按钮](https://resources.jetbrains.com.cn/help/img/idea/2026.3/reset-frame.png)

> **Note:**
> 重置帧  仅重置局部变量。 这不会还原对应用程序全局状态的更改。

## 使用断点表达式

为了更改程序的流程，您可以使用 [非暂停断点](using-breakpoints.html#suspend_policy)，当命中时 [评估表达式](examining-suspended-program.html)。 例如，当您想在调试过程中自动修改变量时，这很有用。

```JAVA
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`  方法被反复执行，直到我们禁用重置断点为止。

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

```JAVA
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`  标志的值，从而添加所需的调试专用行为。

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

1. 在您希望修改程序状态的行 [添加断点](using-breakpoints.html#set-breakpoints)。

2. 请前往 [断点属性](using-breakpoints.html#breakpoint-properties)。

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

## 从当前方法强制返回

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

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

Procedure:

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

![强制返回菜单项](https://resources.jetbrains.com.cn/help/img/idea/2026.3/debug_altering_flow_return.png)

2. 如果方法返回一个值（其返回类型不是  `void` ），请指定该值或将计算该值的表达式。

![返回值对话框](https://resources.jetbrains.com.cn/help/img/idea/2026.3/debug_altering_flow_return2.png)

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

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

![对话框询问您是否要在 finally 中执行代码](https://resources.jetbrains.com.cn/help/img/idea/2026.3/debug_altering_flow_force_return_finally.png)

## 抛出一个异常

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

Procedure:

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

![抛出异常菜单项](https://resources.jetbrains.com.cn/help/img/idea/2026.3/debug_altering_flow_throw.png)

2. 创建异常（这可以是任何  `Throwable` ，包括  `错误` 和方法未处理的检查异常）。 不要在表达式中使用  `抛出` 关键字，例如：  `new NullPointerException()`

![抛出异常对话框](https://resources.jetbrains.com.cn/help/img/idea/2026.3/debug_altering_flow_throw2.png)

## 重新加载修改的类

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

Procedure: 重新加载所有更改的文件

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

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

![编辑器中的代码更改弹出窗口](https://resources.jetbrains.com.cn/help/img/idea/2026.3/hotswap-popup.png)

如果 IntelliJ IDEA 检测到 HotSwap 无法应用的更改，它会显示   重新启动调试   ![](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app-client.expui.run.restartDebug.svg) 按钮，该按钮位于   代码已更改   弹出窗口中。 将鼠标悬停在该按钮上可查看检测到的更改，或点击该按钮以使用修改后的代码重新启动调试会话。 如需更多信息，请参阅 [HotSwap 限制](#hotswap-limitations)。

> **Tip:**
> 您可以通过清除  `构建、执行、部署 | 调试器 | 热替换` 中的   在编辑器中建议热替换当代码被修改时  复选框来禁用   代码已更改  弹出窗口。

如果在   重新加载类之前构建项目   中启用  `设置 | 构建、执行、部署 | 调试器 | HotSwap`  选项，则会自动重新编译。 否则，您需要在重新加载之前重新编译文件（  `构建 | 重新编译`  `Ctrl+Shift+F9` (Windows), `⌘ ⇧ F9` (macOS), `⌘ ⇧ F9` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ F9` (macOS System Shortcuts), `Ctrl+Shift+F9` (XWin), `Ctrl+Shift+F9` (GNOME), `Ctrl+Shift+F9` (KDE), `Ctrl+Shift+F9` (Emacs), `Ctrl+B` (Sublime Text), `⌘ B` (Sublime Text (macOS)), `Ctrl+F7` (Visual Studio), `⌘ F7` (Visual Studio (macOS)), `F9` (NetBeans), `Ctrl+Shift+F9` (Eclipse), `⌘ ⇧ F9` (Eclipse (macOS))）。

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

Procedure: 重新加载单个更改的文件

1. 按下 `Ctrl+Shift+A` (Windows), `⌘ ⇧ A` (macOS), `⌘ ⇧ A` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ P` (macOS System Shortcuts), `Ctrl+Shift+A` (XWin), `Ctrl+Shift+A` (GNOME), `Ctrl+Shift+A` (KDE), `Escape, X` (Emacs), `Ctrl+Shift+P` (Sublime Text), `⌘ ⇧ P` (Sublime Text (macOS)), `Ctrl+Shift+A` (Visual Studio), `⌘ ⇧ A` (Visual Studio (macOS)), `Ctrl+I` (NetBeans), `Ctrl+Shift+A` (Eclipse), `⌘ 3` (Eclipse (macOS))。

2. 在打开的 [Search Everywhere](searching-everywhere.html)对话框中，输入  `编译并重新加载文件` ，选择相应的操作，然后按 `Enter` (Windows), `⏎` (macOS), `⏎` (IntelliJ IDEA Classic (macOS)), `⏎` (macOS System Shortcuts), `Enter` (XWin), `Enter` (GNOME), `Enter` (KDE), `Enter` (Emacs), `Enter` (Sublime Text), `⏎` (Sublime Text (macOS)), `Enter` (Visual Studio), `⏎` (Visual Studio (macOS)), `Enter` (NetBeans), `Enter` (Eclipse), `⏎` (Eclipse (macOS))。

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

### HotSwap 限制

由于虚拟机设计，HotSwap 有以下限制：

* 仅在修改方法体时可用。 不支持更改方法签名和返回值类型。

* 不支持添加和移除方法、字段和内部类。

* 不支持更改类种类、超类型、字段类型，以及类、方法和字段的修饰符。

* 添加 lambda 表达式或匿名类，或更改其捕获的变量，会更改类结构，因此不受支持。 在 Kotlin 中，这不适用于传递给内联函数的 lambda。

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

在调试会话期间修改 Java 或 Kotlin 代码时，IntelliJ IDEA 会根据这些限制检查更改。 如果更改无法重新加载，或文件包含语法错误，IDE 会建议重新启动调试会话，而不是应用 HotSwap。

如果要移除标准虚拟机施加的限制，可以使用 Dynamic Code Evolution VM (DCEVM)，它无限制地支持在运行时重新加载类。 启用 DCEVM 后，IntelliJ IDEA 不会检查更改，并且始终建议 HotSwap。

## See also

### 参考

[审核编译和构建输出](compiling-applications.html#see-results)

