CodeGym /Java 博客 /随机的 /在 IntelliJ IDEA 中调试:初学者指南
John Squirrels
第 41 级
San Francisco

在 IntelliJ IDEA 中调试:初学者指南

已在 随机的 群组中发布
CodeGym 社区的大家好!今天我们来谈谈调试——它是什么以及如何在 IntelliJ IDEA 中进行调试。本文适用于已经对 Java Core 有最低限度了解的人。不会有任何框架或复杂的过程来发布库。悠闲漫步。所以让自己舒服,让我们开始吧! 在 IntelliJ IDEA 中调试:初学者指南 - 1

为什么需要调试模式

让我们立即为自己澄清一些事情:没有错误的代码......这就是生活的方式。所以,如果我们的代码没有按预期工作,我们不应该崩溃和放弃。但是我们该怎么办呢?好吧,我们可以把System.out.println语句放在各处,然后梳理控制台输出,希望能找到错误。也就是说,您可以(并且人们确实)使用仔细的日志记录进行调试。但是如果你可以在本地机器上运行你的代码,最好使用调试模式。我想立即说明,在本文中我们将考虑使用 IntelliJ IDEA 调试项目。

什么是调试模式?

调试模式用于调试(检查)正在运行的代码。它使您可以在指定的地方停止执行并查看事情的进展情况。它可以让您了解代码中特定位置的程序状态。就像能够让时钟停止,从侧面看一切一样。很酷,对吧?我们的目标是快速轻松地学习如何使用我们钟爱的 IntelliJ IDEA 开发环境调试应用程序。

开始调试需要什么

这里有一些免费的建议:阅读本文时,请执行此处描述的所有操作 — 您已完成后续需要执行的所有操作。你需要什么:
  1. IntelliJ IDEA 版本 2019.3.1 或更高版本。如果有人没有这个,您可以在此处下载链接。下载社区版——这是我将使用的版本。
  2. 克隆这个 GitHub 项目并通过 IDEA 导入它。
打开 IDEA: 在 IntelliJ IDEA 中调试:初学者指南 - 2选择debug-presentation项目并按OK。然后您将看到以下窗口: 在 IntelliJ IDEA 中调试:初学者指南 - 3保留所选选项:从外部源Maven导入项目。单击完成。现在我们已经导入了项目,我们可以用一个活生生的例子来描述剩下的过程。

只是一点理论......我保证:D

要开始一点点调试,您需要了解什么是断点并熟悉一些热键。断点是一个特殊的标记,指示您希望应用程序的执行停止的位置,可能基于应用程序状态您可以通过左键单击左侧面板或单击代码位置并按Ctrl+F8来设置断点。让我们看一下三种类型的断点:行断点、字段观察点和方法断点。这是它的样子:
  • 在一条线上:

    在 IntelliJ IDEA 中调试:初学者指南 - 4

    如果语句中有 lambda 表达式,那么 IDEA 会提示你选择是将断点放在整个语句上还是专门放在 lambda 表达式上:

    在 IntelliJ IDEA 中调试:初学者指南 - 5
  • 在一个方法上:

    在 IntelliJ IDEA 中调试:初学者指南 - 6
  • 在课堂上:

    在 IntelliJ IDEA 中调试:初学者指南 - 7
可以按照用于添加断点的相同步骤删除断点。有些情况下您会想要停用(静音)它们。为此,请 在 IntelliJ IDEA 中调试:初学者指南 - 8在“调试”部分找到该图标。这将使所有断点静音。要查看已设置的断点,您可以转到左下角的调试部分并找到图标 在 IntelliJ IDEA 中调试:初学者指南 - 9,或者按Ctrl+Shift+F8在 IntelliJ IDEA 中调试:初学者指南 - 10移动到断点列表,我们将看到以下内容: 在 IntelliJ IDEA 中调试:初学者指南 - 11有两个断点这里:
  • Bee.java:24 — 在第 24 行的 Bee 类中
  • Main.java:14 — 在第 14 行的 Main 类中
请注意,如果您克隆了项目,这些断点将不会自动设置:您需要自己设置它们!还有一个Java 异常断点部分。这非常有用。在这里您可以添加一个隐式断点,以便程序在抛出任何异常或特定异常之前停止。我们将为 RuntimeException 添加一个隐式断点。这很容易做到。找到左上角的“+”图标。单击它并选择Java Exception Breakpoints在 IntelliJ IDEA 中调试:初学者指南 - 12在出现的窗口中,写下您要添加的异常的名称,从列表中选择并单击 OK 关于 在 IntelliJ IDEA 中调试:初学者指南 - 13如何设置的入门知识到此结束,现在我们我会继续练习。

让我们去做这个叫做调试的事情吧!

我来自养蜂人世系,因此我创建的用于说明调试的项目描述了蜜蜂采集花蜜、将花蜜加工成蜂蜜、然后从蜂箱中提取蜂蜜的过程模型。根据可以在项目根目录中找到的文档README 文件,所有收集花蜜的花的预期行为是收集的蜂蜜量(采用 double 形式等于一半收集的花蜜。该项目有以下类:
  • 蜜蜂——一只普通的工蜂
  • BeeQueen——蜂王
  • BeeHive——蜂箱
  • HoneyPlant — 一种采集花蜜的蜜源植物(花蜜来源)
  • Main — 这是我们找到的地方public static void main(),执行开始的方法。
如果我们运行该main()方法,那么我们发现我们的程序不仅没有计算蜂蜜的数量,而且还抛出异常…… 在 IntelliJ IDEA 中调试:初学者指南 - 14我们需要排查并确定问题出在哪里。从右下角的跟踪堆栈中,我们可以看到在 RuntimeException was thrown at HoneyPlant.java:20: 在 IntelliJ IDEA 中调试:初学者指南 - 15That 正是我们上面所说的。让我们通过在调试模式下运行该方法来观察此 RuntimeException main()。为此,请单击main()方法旁边的 IntelliJ IDEA 中的绿色三角形箭头。 在 IntelliJ IDEA 中调试:初学者指南 - 16结果,我们将在抛出异常之前立即停止程序,我们将看到此图标: 在 IntelliJ IDEA 中调试:初学者指南 - 17在 IntelliJ IDEA 中调试:初学者指南 - 18要获取所有可用信息,我们需要查看“调试”部分。它有一个变量显示应用程序这部分可用的所有变量的窗格:
  • 花蜜= 1.0;
  • 花蜜容量 = -1.0。
抛出异常是有道理的,因为蜂蜜植物不能有负量的花蜜。但是为什么会这样呢?毕竟,在第 15-17 行,我们检查 nectar 供应是否耗尽,如果是则返回零:

	if (nectar == 0) {
   	     return 0;
}
但问题是我们检查了错误的变量。这是代码中的错误。该程序没有检查花中可用的花蜜量(存储在nectarCapacity变量中),而是检查方法的花蜜参数值,即我们要从花中提取的花蜜量。这里是!我们的第一个错误!解决这个问题后,我们得到以下代码:

	if (nectarCapacity == 0) {
   	     return 0;
}
main()现在以正常方式 运行该方法(Run 'Main.main()')。没有抛出异常,程序运行: 在 IntelliJ IDEA 中调试:初学者指南 - 19应用程序运行完成并给出以下答案:

"33.0 honey was produced by 7 bees from 2 honey plants"
现在一切都会好起来的,但这个答案是不正确的......根据文档README 文件,花蜜以 2 比 1 的比例转化为蜂蜜:

## Documentation
Presentation based on honey production.

**Note**: 2 units of nectar = 1 unit of honey
主要方法显然有两种蜂蜜植物,分别有 30 单位和 40 单位的花蜜。所以我们最终应该得到 35 个单位的蜂蜜。但是程序告诉我们,我们得到了 33。其他两个单位去哪儿了?让我们找出答案!为此,请在Main.main()第 28 行的方法中设置一个断点,在调试模式下 beeHive.populateHoney()调用并运行该方法:main()在 IntelliJ IDEA 中调试:初学者指南 - 20我们将更详细地考虑这一点。程序在执行第 28 行之前停止执行。在下半部分,我们看到调试部分,它显示了有关正在运行的应用程序的所有可用信息。如前所述,Variables 窗格包含应用程序这部分可用的所有变量和对象。“框架”窗格显示应用程序正在执行的步骤——您可以查看之前的(框架)步骤并查看所有本地数据。要继续运行程序,可以按F9或绿色图标,如下图: 在 IntelliJ IDEA 中调试:初学者指南 - 21要停止程序,单击红色方块: 在 IntelliJ IDEA 中调试:初学者指南 - 22要以调试模式重新启动应用程序,单击箭头:在 IntelliJ IDEA 中调试:初学者指南 - 23进一步,您可以通过使用两个键逐步应用:
  • F8 — 单步执行代码而不单步执行方法;
  • F7 — 单步执行代码并单步执行方法。
在我们的例子中,我们需要按 F7 进入beeHive.populateHoney()方法。进入其中,我们得到: 在 IntelliJ IDEA 中调试:初学者指南 - 24现在我们将使用F8单步执行此方法并描述其中发生的情况:
  • 第 25 行——Stream API 用于收集所有蜜蜂的花蜜
  • 第 26 行——将新创建的蜂蜜添加到现有蜂蜜中;
  • 第 27 行——为蜂王分配了 2 个单位的蜂蜜
  • 第 28 行——从蜂蜜总量中去除这两个单位
  • 第 29 行——女王吃了这种蜂蜜。
这就是两个失踪单位的去处!欢呼!在与业务分析师交谈后,我们得出结论,文档README 文件包含错误,需要更新。让我们更新 README 文件:

## Documentation
Presentation based on honey production.

**Note**:
* 2 units of nectar = 1 unit of honey
* The queen bee eats 2 units of honey every time when beehive is replenished with honey.
我们完成了。我们已经修复了我们发现的所有错误。我们可以洋洋得意地继续下去,喝点咖啡,然后阅读Stack Overflow CodeGym 上的文章 :)

让我们总结一下

在本文中,我们了解到:
  • 每个人的工作都有错误,调试是修复错误的好方法
  • 什么是断点以及有哪些类型的断点
  • 如何设置异常断点
  • 如何在调试模式下单步执行代码

阅读文章

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION