教程:调试您的第一个 Java 应用程序
最后修改时间:2023 年 8 月 23 日您已经创建并运行了Java 应用程序。假设您发现它的功能与您预期的不同。例如,它返回错误值或因异常而崩溃。看来您的代码中有错误,是时候对其进行调试了。
什么是调试?
从广义上讲,调试是检测和纠正程序中的错误的过程。
您将要处理不同类型的错误。其中一些很容易捕获,例如语法错误,因为它们由编译器处理。另一个简单的情况是,可以通过查看堆栈跟踪来快速识别错误,这可以帮助您找出错误发生的位置。
然而,有些错误可能非常棘手,并且需要很长时间才能找到和修复。例如,在程序早期发生的微妙逻辑错误可能直到很晚才显现出来,有时解决问题是一个真正的挑战。
这就是调试器有用的地方。调试器是一个功能强大的工具,它可以让您深入了解程序的内部操作,从而更快地找到错误。这可以通过暂停执行并通过彻底检查变量以及它们如何逐行更改来分析程序状态来实现。在调试时,您可以完全控制一切。在本手册中,我们将介绍一个基本的调试场景以帮助您入门。
检查代码
让我们尝试一个简单的调试案例。假设我们有以下应用程序:
public class AverageFinder {
    public static void main(String[] args) {
        System.out.println("Average finder v0.1");
        double avg = findAverage(args);
        System.out.println("The average is " + avg);
    }
    private static double findAverage(String[] input) {
        double result = 0;
        for (String s : input) {
            result += Integer.parseInt(s);
        }
        return result;
    }
}该程序应该计算作为命令行参数传递的所有值的平均值。
编译和运行没有问题;然而,结果却并非如人所愿。例如,当我们1 2 3作为输入传递时,结果是6.0。
首先,您需要考虑可疑的错误可能来自哪里。我们可以假设问题不在打印语句中。最有可能的是,我们的方法产生了意想不到的结果findAverage。为了找到原因,让我们检查它在运行时的行为。
设置断点
为了检查程序在运行时的运行情况,我们需要在可疑代码段之前暂停其执行。这是通过设置断点来完成的。断点指示程序将暂停的代码行,以便您检查其状态。
- 单击调用该方法的行处的装订线 - findAverage。 
在调试模式下运行程序
现在让我们以调试模式启动程序。
由于我们将传递用于运行和调试程序的参数,因此请确保运行/调试配置具有这些参数。
- 单击装订线中的“运行”图标,然后选择“修改运行配置”。  
- 在程序参数字段中输入参数。  
- 单击该方法附近的“运行” - main按钮。从菜单中选择“调试”。 
分析程序状态
调试器会话启动后,程序正常运行,直到命中断点。发生这种情况时,程序暂停的行会突出显示,并且会出现“调试”工具窗口。

突出显示的行尚未执行。该程序现在等待您的进一步指示。挂起状态允许您检查保存程序状态的变量。
由于该findAverage方法尚未被调用,因此它的所有局部变量result尚未在范围内,但是,我们可以检查数组的内容args(args在该main方法的范围内)。的内容args在使用时内联显示args:

您还可以在“变量”面板中获取有关当前范围内的所有变量的信息。

单步执行程序
现在我们已经熟悉了“调试”工具窗口,是时候进入该findAverage方法并了解其内部发生了什么。
- 要单步执行方法,请单击“单步执行”按钮或按。F7  - 另一行在编辑器中突出显示,因为我们将执行点向前推进了一步。 
- 使用Step Over 继续步进。请注意它与Step Into有何不同。虽然它也将执行向前推进了一步,但它不会像一路上那样访问其他方法。F8 - Integer.parseInt()- 让我们继续单步查看局部变量 - result是如何声明的以及它如何随着循环的每次迭代而更改。 - 现在变量 - s包含值- "3"。它将被转换为int并添加到- result,当前值为- 3.0。到目前为止没有错误。总和计算正确。
- 再走两步就可以看到 - return声明,我们就可以看到遗漏在哪里。我们返回- result,其值为- 6.0,但不将其除以输入数量。这是程序输出不正确的原因。 - 提示- 要在暂停后继续执行程序,请按或选择运行 | 调试操作| 从主菜单恢复。F9 
- 让我们纠正错误: - return result / input.length;
停止调试器会话并重新运行程序
为了检查程序是否正常工作,让我们停止调试器会话并重新运行程序。
- 单击 - Stop按钮或按。CtrlF2 
- 单击该方法附近的“运行” - main按钮。从菜单中选择“运行”。 
- 验证程序现在是否正常工作。  
感谢您的反馈意见!