IntelliJ IDEA快速入门 | 第三十三篇:在IntelliJ IDEA中如何进行断点调试呢?

断点调试是程序员的一个基本技能,有多重要不用我再说了吧😊。如果你之前使用过Eclipse的话,那么Eclipse当中的调试你应该都基本掌握了。其实,在IntelliJ IDEA当中,区别不大,等会我给大家简单演示一下,你就什么都知道了。

Debug的设置

首先,我们需要对IntelliJ IDEA做一个优化设置。大家进入到IntelliJ IDEA的设置界面中,展开左侧的Build, Execution, Deployment这一项,这时,你会在其下面看到Debugger,点一下它,你就能看到如下的界面了。

在这里插入图片描述

从以上界面中,你能看到Transport这一项默认选择的是Socket模式,但是这里我们要给它勾选成Shared memory这种模式,尤其是对于Windows系统来讲,勾选为后者的话,一定程度上可以节省我们的内存空间,这是IntelliJ IDEA一个优化层面的设置哟😊,弄好之后,点击OK按钮即可。

在这里插入图片描述

断点调试,您会吗?

常用断点调试快捷键

在我为大家演示断点调试之前,先给大家介绍一下IntelliJ IDEA断点调试的几个基本操作,这几个操作,想必大家要是用过Eclipse的话,应该都是比较熟悉了,这几个操作分别是:

在这里插入图片描述

如果大家之前没有使用过这些断点调试操作的话,那么我就为大家简单举一个小例子介绍一下吧😀,希望大家能够看得懂!

不知道小时候大家有没有玩过超级玛丽,我就以超级玛丽为例子来讲述了,如下图所示。

在这里插入图片描述

如果我们现在执行的是叫step overover其实就是略过的意思)的操作,那么此时程序并不会进入方法体内。比方说程序现在运行到一行代码处了,不管这行代码调用的是一个方法也好,还是一个什么构造方法也好,执行step over操作,程序都不会进入到方法体内,这就好比是超级玛丽直接就跳到第一个井盖上了,而且并不会进去井盖里面。

在这里插入图片描述

如果你要是再执行step over操作,那么程序就直接跳到下一行代码处了,这就好比是超级玛丽又跳到了下一个井盖上,注意,此时超级玛丽并不会进去井盖里面哟~

在这里插入图片描述

现在,你该知道step over操作的意思了吧😝

step intoforce step into这两操作的意思是一样的,从into就能知道这两操作都会进入到方法体内。这是什么意思呢?假设超级玛丽此刻是站在了第一个井盖上,如果现在执行的是step into或者force step into操作,那么就好比是超级玛丽会跳进到这个井盖里面,如下图所示。

在这里插入图片描述

超级玛丽从井盖里面跳进去之后,就要开始闯第二关了,我还清楚地记得,超级玛丽过第二关的时候应该是在水下,好久没玩这个游戏了,也不知道是不是这样了。

超级玛丽从井盖上跳进去之后,它也要能从井盖中跳出来呀,你说是不是的啊😝!如果现在执行的是step out操作,那么就好比是超级玛丽从第二个井盖中跳出来了,如下图所示。

在这里插入图片描述

有的时候,当我们执行step into操作进入某一个方法或者某一个构造方法里面去查看其内部代码的一个执行情况之后,还得要从其方法体内跳出来,执行后续的代码,此时,就得执行step out操作从方法体内跳出来了。

resume program操作是啥子意思呢?它说的是这个意思,比如说我们在第三个井盖处设置过一个断点,在第五个井盖处也设置过一个断点,并且现在超级玛丽站在第一个井盖上,此时,执行一下resume program操作,那么就好比是超级玛丽会直接从第一个井盖跳到第三个井盖上。

在这里插入图片描述

再执行一下resume program操作,超级玛丽又会从第三个井盖跳到第五个井盖上了。

在这里插入图片描述

看到没有,执行resume program操作,程序会直接跳转到在下一个断点处。

stop操作就是来结束我们整个的断点调试的,这不用多说;mute breakpoints操作会使所有的断点失效,这也比较好理解;view breakpoints操作就是用来显示所有断点的,这也比较好理解,我就不画图演示了。

如果你要是对以上IntelliJ IDEA断点调试的几个基本操作不熟悉的话,我稍微墨迹了一下,给大家说了一下。而且,这几个基本操作对应也有快捷键,至于这些快捷键的话,我也设置成是跟Eclipse是一样的了,如果还有不知道的同学,那么请回头翻阅我的《IntelliJ IDEA快速入门 | 第二十五篇:IntelliJ IDEA快捷键的设置》这篇文章。

接下来,我会通过一个简单的例子,来简单给大家演示一下IntelliJ IDEA中的断点调试。

断点调试演示

首先,在工程下面新建一个类,例如DebugTest,用于演示IntelliJ IDEA中的断点调试。

在这里插入图片描述

编写完以上这样一个类之后,为了以它为例来给大家IntelliJ IDEA中的断点调试,我就在该类的如下四行代码处打上一个断点,打断点非常简单,在该行代码的前面鼠标左键点击一下即可。

在这里插入图片描述

打上以上四个断点之后,在DebugTest类里面的任意位置右键,并在弹出的下拉列表中选中Debug 'DebugTest.main()'这一项,即以Debug的模式来运行DebugTest类中的main方法。

在这里插入图片描述

这时,咱们就进入到Debug模式了,如下图所示。

在这里插入图片描述

下面,我们就来好好说说IntelliJ IDEA断点调试里面的那几个基本操作。

step over

我们现在先演示一下step over操作。执行该操作,就意味着程序不会进入到方法体内,而是会一行一行代码往下运行。当程序一步一步往下运行的过程当中,你会发现map变量里面的元素个数是能够显示出来的,这就非常方便我们去观察变量的值了,你说是不是啊?当程序运行至下面这行代码处时,你会发现map变量里面的元素个数就是4了。

String age = map.get("age");

截图如下:

在这里插入图片描述

resume program

此时,我们执行一下resume program操作,你会发现程序停留在了下一个断点处,即map.remove("major");这行代码前面的断点。

在这里插入图片描述

由于程序下面再也没有断点了,那么再执行一下resume program操作,整个断点调试自然就会结束了,如下图所示。

在这里插入图片描述

view breakpoints

如果我们此时再执行一下view breakpoints操作,那么你会发现在当前程序中一共是有四个断点,如下图所示。

在这里插入图片描述

(force) step into/out

我们现在再以Debug的模式来运行DebugTest类中的main方法,不过此时只须点击工具栏中的小臭虫图标即可,如下图所示。

在这里插入图片描述

这时,程序停留在了第一个断点处,如下图所示。

在这里插入图片描述

然后,我们想进入到HashMap类的构造方法中去看看,该怎么办呢?先执行一下force step into操作,你会发现此时程序来到ClassLoader抽象类的checkPackageAccess方法中了,如下图所示。

在这里插入图片描述

这并不是我们想要看的。那我们就再执行一下step out操作从该方法里面跳出来,此时你会发现程序又回到咱们自己写的DebugTest类中了,如下图所示。

在这里插入图片描述

接着,我们再执行一下force step into操作,此时程序就进入到HashMap类的如下构造器当中了,可以看到该构造器里面只有一行代码。

在这里插入图片描述

我们不妨执行一下step over操作,让程序一步一步往下运行,在这一过程中,你会看到一个默认的加载因子(0.75),除此之外,也能看到HashMap的size是0。

在这里插入图片描述

继续执行step over操作,此时程序就又回到咱们自己写的DebugTest类中了,如下图所示。

在这里插入图片描述

继续执行step over操作,此时程序运行到了下面这行代码处,如下图所示。

在这里插入图片描述

我们想看一下以上put方法里面都做了些啥,该怎么办呢?不用我哔哔了吧,直接执行force step into操作进去该方法里面看看不就完了,是不是?

在这里插入图片描述
看到没有,以上就是put方法里面所做的事情,在它里面又调用了一个putVal方法,如果我们想再进入putVal方法里面去看一看,那么又该怎么办呢?不妨我们执行一下step into操作,这时,你会发现在putVal方法上弹出了一个提示框,如下图所示,这是在告诉我们选择一个方法进入,因为putVal方法里面又调用了一个hash方法。

在这里插入图片描述

我们不妨点击hash方法进去它里面看一下,如下图所示。

在这里插入图片描述

看完之后,我们再执行step out操作从hash方法里面跳出来,此时,程序又回到了put方法中,如下图所示。

在这里插入图片描述

此时,我们再执行一下step into操作,发现终于进入到putVal方法中了,如下图所示。

在这里插入图片描述

进入之后,不妨继续执行step over操作,让程序一步一步往下运行,这个才是代码真正的一个执行过程,当程序运行到下面这行代码处时,你会发现又调用了一个resize方法。

在这里插入图片描述

如果你想看下resize方法里面都做了哪些事情,那么执行一下step into操作就行;如果你不想看,那么就继续执行step over操作,让程序一步一步往下运行。这儿,不妨我们执行一下step into操作进去resize方法里面看看。

在这里插入图片描述

你看了一会,不想往下继续看了,那么执行一下step out操作从resize方法里面跳出来就得了,此时,程序又回到了putVal方法中,如下图所示。

在这里插入图片描述

接着,继续执行step over操作,让程序一步一步往下运行,当程序运行到下面这行代码处时,你会发现又又调用了一个newNode方法。

在这里插入图片描述

如果你想再看下newNode方法里面都做了哪些事情,那么执行一下step into操作就行。

在这里插入图片描述

看完以后,再执行一下step out操作就能从newNode方法里面跳出来了,此时,程序又再次回到了putVal方法中,如下图所示。

在这里插入图片描述

紧接着,继续执行step over操作,让程序一步一步往下运行。如果你不想让程序按部就班地往下运行了,那么可以直接执行step out操作从putVal方法里面跳出来哟😀,你会发现此时程序又回到put方法中了。

在这里插入图片描述

继续执行step out操作从put方法里面跳出来,最终程序又回到我们自己写的DebugTest类中了,如下图所示。

在这里插入图片描述

mute breakpoints

mute breakpoints操作会使所有的断点失效。执行完mute breakpoints操作,你会发现所有的断点都变成灰色了,也就是说它们不再起作用了。

在这里插入图片描述

再执行一次mute breakpoints操作,所有的断点又都重新生效了,如下图所示。

在这里插入图片描述

stop

stop操作会结束我们整个的断点调试。如果执行stop操作,那么断点调试程序也就自然终止了。

在这里插入图片描述

至此,我就将IntelliJ IDEA断点调试中的几个基本操作都一一介绍给大家了,不难,是不是?而且,断点调试的时候,你用快捷键也是可以的,不知道大家刚才有没有注意到,当你把光标放在以上那些小图标上时,快捷键就会自然而然显示出来了。

上面我也说了,IntelliJ IDEA断点调试中的几个基本操作所对应的快捷键,我也设置成是跟Eclipse是一样的了,大家可以去用一下这些快捷键,就是咱们键盘上F5F6F7等这样几个常用的键。

条件断点

在调试的时候,我们常常会需要在循环里面增加一个条件判断,这样可以极大的提高效率,而且心情也能愉悦点。

举个例子,我们可以在DebugTest类的main方法中编写一个如下for循环,并在for循环内部的输出语句上打上一个断点,如下图所示。

在这里插入图片描述

那么,此时如何设置条件断点呢?在断点上右键,这时会弹出一个如下对话框。

在这里插入图片描述

然后在对话框中输入一个条件,例如i == 60,记住这个条件一定要是一个布尔类型的,条件写好之后,点击Done按钮即可。

在这里插入图片描述

以上就设置好了一个条件断点。

这个时候,我们再以Debug的模式来运行DebugTest类中的main方法,发现程序停留在了我们刚刚设置的条件断点处,此时i是等等于60的。

在这里插入图片描述

也就是说,如果在以上for循环中没有设置条件断点,那么for循环会从0开始逐个地往下走,但是我设置了一个条件断点之后,for循环一下子就执行到了我们断点满足的条件处,相当于加快了我们断点调试的时间。

然后,我们执行一下resume program操作,你会发现程序停留在了下一个断点处,即HashMap<String, String> map = new HashMap<String, String>();这行代码前面的断点。

在这里插入图片描述

接着,再执行step over操作,让程序一步一步往下运行,直至运行到下面这行代码处为止。

在这里插入图片描述

这个时候,还有一个操作,我得给大家说一下,那就是使用Ctrl + U快捷键查看一下表达式的值。此时,可以看到我们选中的是map.put("age", "18");这一行代码,那我们不妨点一下Ctrl + U快捷键,发现弹出来了一个如下对话框。

在这里插入图片描述

如果我们就想查看一下map变量的值,那么在以上对话框中输入map变量回车即可。

在这里插入图片描述

可以看到,此时列出来了当前这个map变量它的值的一个情况,而且size还是1。也就是说,map变量里面只有一个值,即key是name,value是Tom,为什么只有一个值啊?因为map.put("name", "Tom");这行代码执行了,而map.put("age", "18");这行代码还未执行。

以上就是关于Debug使用的一个简单说明,后续的话,你只有在使用过程当中才会深刻地体会到,我说再多也是一个屁。最后,我再着重强调一遍,断点调试是程序员调试程序的一个必备的技能,大家可一定要掌握哟😜

相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页