CodeGym 社区的大家好!今天我们来谈谈调试——它是什么以及如何在 IntelliJ IDEA 中进行调试。本文适用于已经对 Java Core 有最低限度了解的人。不会有任何框架或复杂的过程来发布库。悠闲漫步。所以让自己舒服,让我们开始吧!
选择debug-presentation项目并按OK。然后您将看到以下窗口:
保留所选选项:从外部源和Maven导入项目。单击完成。现在我们已经导入了项目,我们可以用一个活生生的例子来描述剩下的过程。
在“调试”部分找到该图标。这将使所有断点静音。要查看已设置的断点,您可以转到左下角的调试部分并找到图标
,或者按Ctrl+Shift+F8:
移动到断点列表,我们将看到以下内容:
有两个断点这里:
在出现的窗口中,写下您要添加的异常的名称,从列表中选择并单击 OK :关于
如何设置的入门知识到此结束,现在我们我会继续练习。
文档README 文件,所有收集花蜜的花的预期行为是收集的蜂蜜量(采用 double 形式)等于一半收集的花蜜。该项目有以下类:
我们需要排查并确定问题出在哪里。从右下角的跟踪堆栈中,我们可以看到在 RuntimeException was thrown at
That 正是我们上面所说的。让我们通过在调试模式下运行该方法来观察此 RuntimeException
结果,我们将在抛出异常之前立即停止程序,我们将看到此图标: ![在 IntelliJ IDEA 中调试:初学者指南 - 17]()
要获取所有可用信息,我们需要查看“调试”部分。它有一个变量显示应用程序这部分可用的所有变量的窗格:
应用程序运行完成并给出以下答案:
文档README 文件,花蜜以 2 比 1 的比例转化为蜂蜜:
我们将更详细地考虑这一点。程序在执行第 28 行之前停止执行。在下半部分,我们看到调试部分,它显示了有关正在运行的应用程序的所有可用信息。如前所述,Variables 窗格包含应用程序这部分可用的所有变量和对象。“框架”窗格显示应用程序正在执行的步骤——您可以查看之前的(框架)步骤并查看所有本地数据。要继续运行程序,可以按F9或绿色图标,如下图:
要停止程序,单击红色方块:
要以调试模式重新启动应用程序,单击箭头:
进一步,您可以通过使用两个键逐步应用:
现在我们将使用F8单步执行此方法并描述其中发生的情况:
文档README 文件包含错误,需要更新。让我们更新 README 文件:
Stack Overflow CodeGym 上的文章 :)

为什么需要调试模式
让我们立即为自己澄清一些事情:没有错误的代码......这就是生活的方式。所以,如果我们的代码没有按预期工作,我们不应该崩溃和放弃。但是我们该怎么办呢?好吧,我们可以把System.out.println
语句放在各处,然后梳理控制台输出,希望能找到错误。也就是说,您可以(并且人们确实)使用仔细的日志记录进行调试。但是如果你可以在本地机器上运行你的代码,最好使用调试模式。我想立即说明,在本文中我们将考虑使用 IntelliJ IDEA 调试项目。
什么是调试模式?
调试模式用于调试(检查)正在运行的代码。它使您可以在指定的地方停止执行并查看事情的进展情况。它可以让您了解代码中特定位置的程序状态。就像能够让时钟停止,从侧面看一切一样。很酷,对吧?我们的目标是快速轻松地学习如何使用我们钟爱的 IntelliJ IDEA 开发环境调试应用程序。开始调试需要什么
这里有一些免费的建议:阅读本文时,请执行此处描述的所有操作 — 您已完成后续需要执行的所有操作。你需要什么:- IntelliJ IDEA 版本 2019.3.1 或更高版本。如果有人没有这个,您可以在此处下载链接。下载社区版——这是我将使用的版本。
- 克隆这个 GitHub 项目并通过 IDEA 导入它。


只是一点理论......我保证:D
要开始一点点调试,您需要了解什么是断点并熟悉一些热键。断点是一个特殊的标记,指示您希望应用程序的执行停止的位置,可能基于应用程序状态。您可以通过左键单击左侧面板或单击代码位置并按Ctrl+F8来设置断点。让我们看一下三种类型的断点:行断点、字段观察点和方法断点。这是它的样子:-
在一条线上:
如果语句中有 lambda 表达式,那么 IDEA 会提示你选择是将断点放在整个语句上还是专门放在 lambda 表达式上:
-
在一个方法上:
-
在课堂上:




- Bee.java:24 — 在第 24 行的 Bee 类中
- Main.java:14 — 在第 14 行的 Main 类中


让我们去做这个叫做调试的事情吧!
我来自养蜂人世系,因此我创建的用于说明调试的项目描述了蜜蜂采集花蜜、将花蜜加工成蜂蜜、然后从蜂箱中提取蜂蜜的过程模型。根据可以在项目根目录中找到的- 蜜蜂——一只普通的工蜂
- BeeQueen——蜂王
- BeeHive——蜂箱
- HoneyPlant — 一种采集花蜜的蜜源植物(花蜜来源)
- Main — 这是我们找到的地方
public static void main()
,执行开始的方法。
main()
方法,那么我们发现我们的程序不仅没有计算蜂蜜的数量,而且还抛出异常…… 
HoneyPlant.java:20
: 
main()
。为此,请单击main()
方法旁边的 IntelliJ IDEA 中的绿色三角形箭头。 


- 花蜜= 1.0;
- 花蜜容量 = -1.0。
if (nectar == 0) {
return 0;
}
但问题是我们检查了错误的变量。这是代码中的错误。该程序没有检查花中可用的花蜜量(存储在nectarCapacity变量中),而是检查方法的花蜜参数值,即我们要从花中提取的花蜜量。这里是!我们的第一个错误!解决这个问题后,我们得到以下代码:
if (nectarCapacity == 0) {
return 0;
}
main()
现在以正常方式 运行该方法(Run 'Main.main()')
。没有抛出异常,程序运行: 
"33.0 honey was produced by 7 bees from 2 honey plants"
现在一切都会好起来的,但这个答案是不正确的......根据
## 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()




- F8 — 单步执行代码而不单步执行方法;
- F7 — 单步执行代码并单步执行方法。
beeHive.populateHoney()
方法。进入其中,我们得到: 
- 第 25 行——Stream API 用于收集所有蜜蜂的花蜜
- 第 26 行——将新创建的蜂蜜添加到现有蜂蜜中;
- 第 27 行——为蜂王分配了 2 个单位的蜂蜜
- 第 28 行——从蜂蜜总量中去除这两个单位
- 第 29 行——女王吃了这种蜂蜜。
## 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.
我们完成了。我们已经修复了我们发现的所有错误。我们可以洋洋得意地继续下去,喝点咖啡,然后阅读让我们总结一下
在本文中,我们了解到:- 每个人的工作都有错误,调试是修复错误的好方法
- 什么是断点以及有哪些类型的断点
- 如何设置异常断点
- 如何在调试模式下单步执行代码
GO TO FULL VERSION