00:00
好,那么关于快捷键呢,咱们就说完了啊,这是第一个事儿,然后第二个事的话呢,我们再说一下这个debug啊debug呢,我们翻译过来就叫做调试的意思。哎,那就需要呢,调试程序,第一个问题说为什么需要调试程序。来首先呢,我们来看一下这个对应的这个课件这块来说明啊,这个为什么需要debug呢?你看这块写的说编好的程序呢,在执行的过程当中啊,如果出现错误了,我们该如何去定位这些错误呢。对吧,诶简单的这个代码呢,大家直接就可以看出来了,但是如果这个代码量呢,就比较大了,这个几千行,甚至说更复杂的这个业务逻辑了,怎么办呢?我们就需要借助相关的调试工具呢,去查找这个错误了。我们就需要呢去用这个debug。哎,这块具体来讲呢,大家你看看这样几个情况啊,第一种情况呢,咱们在执行程序的时候呢,诶没有任何的bug,程序的执行的是非常正确的,也是我们想要的。啊,这个呢,是我们最希望看到的。但这种概率呢?极低。是吧,极小,哎大家呢,在实际开发当中,你可能这个项目呢,比如说需要做俩月。
01:03
有可能你不到一个月呢就做出来了,剩下的时间呢,全都在调bug,全都在调试。啊,有可能。所以呢,我们这个调试程序呢,还是非常重要的一个环节啊。诶不像呢,说这个比尔盖茨,我就是看到那样一个坊间说明是吧,说一开始他写这个到S系统的时候呢,只花了多少天是吧,写完之后呢,中间过程当中一次也没有去运行过,然后最后写完的啊最后的代码的时候呢,一运行一点问题也没有。啊,说太牛了啊,不知道是真的假的,我觉得不太靠谱啊。嗯,不太可能是吧。他写的可是个操作系统啊。好,这是我们说的这个第一种情况,这种情况呢,概率很小,所以说呢,我们是有必要呢去调试程序的啊,下边呢,这样几种情况,其实一种比一种恶劣啊。第二种情况呢,说运营以后呢,出现了一些错误或者是异常信息。那就是咱们目前呢,能够遇到的一些场景。那么这个时候呢,我们可以呢,借助控制台,或者以后呢,我们还有相关的一些日志文件,我们看一看到底出了什么问题了。
02:05
啊,那么相应的我们去解决这个问题就行。这时候呢?其实我们应该感到庆幸。因为呢,明确告诉我们出了什么问题,甚至说位置都告诉我们了。啊,这个是很好的。啊,如果没告诉你的话呢,那就糟糕了,像下边这样是吧,说进行以后的话呢,得到了结果没报异常,但是呢,这个结果不是我们想要的。这就比较尴尬了。那我们就希望呢,一点点看一看这个在哪些可能的位置。啊,会出现这个问题,那你在可能出现的位置呢,我们去加上一些断点啊进行这个调试。哎,这是第三种情况,这种其实也算还好,为啥呢,好歹呢,他这个结果不是我们想要的,我们去调就可以了。然后第四,第四种情况就比较尴尬了。说这个运行以后啊,出来结果啦,结果呢,大概率是我们想要的。但是如果多次运行的话呢,可能会出现不是我们想要的。
03:00
这个就有点儿闹腾。你比如说我们这个运行了100次。啊,100次的话呢,你发现一次也没有出现问题,你说这个事儿靠谱啊,以为呢是发生的情况一呢,直接就上线了。结果上线以后的话呢,这个呢,用户的访问可不是100次了,诶可能呢,直接呢,就是上10万次甚至更高了,那这个时候呢,你的这个错误率呢,假设是0.1%是吧。哎,你自己呢,测100次呢,你发现一次也没出现。啊,那要是10万次的话呢,这块你乘一下呢。这是。是多少?是是100次吧。是应该是100次是吧,诶,那这只是从平均的概率上来讲呢,就出现了100次。那这个就很尴尬了,说明这个代码还是有问题的。啊,所以这种情况的话呢,就比较隐蔽啊,你得需要具备相关的一些经验啊,才能够去提前啊预知到这样的一些错误。那这个时候的话呢,有必要的话呢,我们也需要呢,去调试程序。OK啊,所以这块你看我列举出来这么多的这个场景,总之一句话呢,就我们在编写程序的过程当中啊一些呃,场景下呢,我们需要呢,进行第八个调试程序。
04:10
OK啊行,那简单来讲呢,我们就CTRLC一下哎。把这呢粘过来。诶就这样啊好,那么下个问题呢,就是如何去抵bug进行这个调试的,下边呢,我也简单的写了一个调试的一个步骤啊,诶稍微大家熟悉了就行,第一个添加断联,第二呢叫启动调试啊,单步执行,然后去发现一下,看看有没有问题。啊,主要的这个就是我们来看这个四了,前面这些呢,其实都是为了这个四呢,来做这个准备的啊。啊,这就我们相应的一个步骤。啊,这个呢,大家不用死记硬背啊,这个你了解了就行,关键呢还是看你具体这个操作看会不会。行,那下边的话呢,咱们就来讲一下这个如何去debug,后续呢,咱们在讲课过程当中啊,还是会接着用的,包括呢,我们后续讲课的过程当中,随着代码量越来越多,尤其呢是学完框架以后呢,我们去学习相关的一些这个项目的时候,代码量起来了,那大家呢,要灵活的去用这个debug啊,甚至说呢,老师上课呢,没有用debug,你自己呢,写出问题来,你得自己会用第八个。
05:10
哎,我这儿呢,先讲几个基本的这个操作啊。这儿呢,我提前呢,写好了几个这个程序,咱们直接呢,就进行一个分析就可以了。啊,先看第一个啊。哎,通过第一个的话呢,我们去讲一些常见的一些操作了。这个呢,我们主要呢,想演示一下这个行断点啊,以及呢,常见的一些这个按钮的一些操作了。这个代码打开以后的话呢,我提前已经写好了相关的一些这个代码了,诶这呢,第一个嗯M呢是10N1020打印一下,然后呢,调一个这个方法,方法里边呢去交换这两个变量,然后呢再打印一下,以前我们写过这个代码。啊,以为的啊。它执行完以后呢,能够交换MN。啊,以为能交换呢,结果实际上没交换是吧?这不就相当于得到了不是我们想要的一个结果吗?我们就想分析一下,诶,这到底啥原因造成的是吧?哎,那么此时的话呢,我们就可以呢,去打这个断点了哈,这个打断点呢,往哪儿打呢。
06:07
这是一个经验。呃,一般呢,就是在你怀疑它可能出现问题的代码的前面。啊,比如这块我们像这块呢,就比较简单了啊,你就怀疑这个方法呢,是不是有问题是吧?诶你就可以把这个断点呢打到这儿哈。哎,因为就这么几行代码,所以我就打出一个断点了啊好,这个断点呢,是一个红色的啊,你用鼠标左键呢,往这一点就可以了。点完以后的话呢,诶我们如果去执行的时候呢,你执行的还是乱,就跟没打一样。啊,所以呢,我们接下来呢,要去选这个叫做debug哈。所以以后我们在开发当中啊,其实大家基本上执行代码的时候都用的是debug啊。就是哪怕你没有断点呢,你要点个debug呢。因为没断点嘛,就跟run一样。哎,不受影响啊,但是要有断点的话呢,这时候他不就可以呢,停下来嘛。好注意哈,我这块呢,就只有这一个断点,然后呢,我去点啊这个操作点这个叫debug啊点一下。
07:03
那么这个时候呢,这个程序呢,就从没方法入口呢,就进来了,它会停留在我们首次添加断点的位置。那就停留到这儿了,首先注意的是这一行代码呢,有没有执行呢?注意对它是没有执行的,我们在这儿呢,是不是一个第bug调试的这样一个界面了哈,一个控制台,这个控制台里边呢,这块有个叫cons。啊叫控制台了,这块你点一下你会看到没有任何输出,他要是执行的话呢,它这块不就有输出了吗。诶这块你看没有,那说明他还没有执行啊,好回过来。然后呢,我们目前呢,是在may方法里边调的,哎,这呢,你看到的就是魅的这个战争。或者你叫方法也行啊,那方法里边呢,我们这不有几个变量吗?X。M是十,N是20,是不是都能看得到,非常的清楚。行,然后的话呢,我们要学习的几个按钮的话呢,一方面是这几个。哎,另外一方面呢,就是这几个。那也就是这样的一个主要的一个操控台啊好,那我们首先呢来看这块吧,这块里边的话呢,我们第一个啊step这你也不用去记哈,它呢就是表示呢,一行一行的往下走。
08:11
哎,所以你看我这块点一下,这不就走到这儿了吗?我再点一下,那就走到这儿了。嗯,再点一下,这不就。到结尾了,我再点就结束了是吧。哎,再点一下,这不就结束了吗。啊,就是这个意思啊,他呢,就表示一行一行的去执行啊,好,我们重新再再去第八个起来。仍然呢,是停留在这儿了。停留到这儿的时候呢,我们接着看哈,这个我要是再往下点的话呢,这不叫下一行了,然后呢,通过这儿呢,我来说一下后边这个操作。后边这个操作呢,一个叫step into into就是进入的意思。另外一个呢,叫force step into强制进入是吧?它俩的一个区别是什么呢?就是我现在这不有个叫LA方法,我要是减这个over的话呢,它其实就略过这个方法,直接呢就执行完了,就开始走下一行了。如果呢,你想看一看这个方法内的代码的话呢,这时候我们就要用into了,但是现在你已经错过了,错的话你可以点上这个就是重新的再去run一下。
09:10
啊,重新执行的啊好,那这时候我们再走到下一行,我现现在呢,想看一看这个swap方法,这个方法呢,是我们自己写的,所以你点这个into也行,点后边这个false呢。Into呢也可以,但是如果呢,我们现在这个代码举个例子啊,如果一会我们想看这个print line这个方法怎么写的,默认的话呢,你点这个step into就不好使了。啊,你得去点那个叫false step图,也就说你要想看系统的源码的时候呢,你得用这个false啊。好,现在是咱们自己写的方法,所以我就点这个into就行啊,一一点,这不就进到这个方法里了,然后你再看这个控制台呢,我们在may方法里边掉了外方法啊,你可以理解成这就是战争一样啊,在他的战针的上面又放了一个战针,在这个swap里边,这不就进来了。那进来以后的话呢,你把这个me方法里边那个MN呢,这不就付给我们里的这个MN了,是不是这俩就过来了,然后下边你就想分析一下,那就下一行,诶又定义这个ta是不就能看到了,是拿这个M负的值,所以呢,它也是十,再往下走,把这个N呢,给了MN呢,给了MM呢,就是20了,然后呢,再把这个ta呢给了N,再点一下这个,哎,比如这块我就不想点了哈,我现在看完这个方法呢,我已经很清楚了哦,原来呢,是两个新的变量,这个方法你不想看了。
10:20
这上还有一个出去。就是可能这个代码后边还有很多啊,我就直接点一下它,那就结束这个方法的执行了。啊,就跳出来了啊,然后接着你再看这行代码,这行代码呢,刚才我提到过啊,如果你要是点这个step into的话呢,它是不会进入系统的源码的,所以我们点一下啊,直接呢,就相当于下一行了哈。啊,这个你再再再点,这不就结束了吗。啊,我们重新再让它跑起来。化解以后呢,这块,比如我点下一行下一行这不是在下一行不到这儿了吗?到这儿的话呢,如果你想看这个print line怎么写的,你就可以点这个false了。点一下。啊,这个呢,其实是因为我们在这个里边哈,涉及到了一个运算,这个运算的话呢,用到了string builder了,所以他就又考虑这个,呃,13的这个部分的一个具体的操作,这个我不想看了,我就再出来这块,我再点一下这个进去。
11:12
这个他就openend,这就这个稍微麻烦的就是他这不有好几个添加的这个行为哈。诶,你看这块呢,这不就最后呢,还要调一个twoth。这一看就有点儿细了啊,哎,我再去点的时候呢。还是不是掉到普拉了是吧。啊,这个大家可能会觉得说怎么有点绕呢,来咱们稍微可以调一下代码,比如这块呢,我就把这个程序呢,我不管你执行到哪了啊,诶我就接着呢,给它停掉了,不执行了。啊,就点上它了,好,那么回过来这个位置呢,如果我们不想看他这样的一个细节啊,比如说在这个位置啊,咱就简单点直接写个hello了啊好,我再重新的再去ebug起来。这时候呢,我们就下一步,下一步这不就到这儿了吗。
12:01
这一行的话呢,如果你要是点这个step into你就看不了了,只有点这个强制进入才能看系统源码啊,点一下这不就直接到print了。这呢就是我想说的这个点啊好,那刚才呢,为啥这个始终呢,在这个spring buffer这块跳过来跳过去,这呢是一个细节,因为呢,这里边儿呢,需要用到spring buffer,然后呢一个一个的去openend了。啊,这是这个细节的事儿,以后我们讲常例的时候呢,再说啊,OK。好,那现在的话呢,你发现呢,我们这个程序呢,目前还在执行,诶我就先还点它呢去结束一下,诶我呢在顺便演示一下这个事儿哈,我加了两个断点。这两个断点的话呢,我们接着呢,去给它第八个起来。此时的话呢,它就直行到这儿了。如果这一行代码的话,你已经很清晰了啊,我就直接呢,让它跳到下一个断点的位置,就点这个。它呢就表示跳到下一个断点。如果后边没有断点了,再一点,那就直接结束了。哎,这就是他的一个情况啊,好,我们再跑起来。
13:00
现在呢,已经在这儿了,然后呢,我现在那个光标呢,我放在这儿,在这一行在闪,那我这儿呢,有个这个操作。这个操作意思就是让他呢,直接就执行到我们这个光标的位置,所以看我点一下。啊,直接就蹦到这儿来了。那就他啊好,然后呢,比如说这个目前这个代码在这儿呢,然后呢,我们可能说呢,诶自己主动的点了点啊点了点我就点到这儿了,诶然后看了看,看了看之后呢,你说哎呀这个断点现在在哪儿了呢。啊,可能这块已经跳的挺远了,我们这儿呢,有个这个操作回一点,这时候就回来说你现在断点了到哪了。啊,又回归到你最初的这个断点的这个位置了,哎,然后呢,这块我要点它,这不就到这个断点再一点这就结束了啊。好,基本上我们把这个功能呢就熟悉了,熟悉熟悉完以后的话呢,我们再把这个代码打开,像咱们之前呢,讲这个数组打印的时候呢,不是当时出现的,说他呢打印的是地址值,它打印的是这个ABC了,为啥是这样的呢?诶你要说不清楚,你可以相应的去打加这个断点呗,是吧,你可以在这行代码的前面去加断点啊,这同样的道理,加到这儿,然后我们上面这个我就给去掉了啊。
14:05
洗掉以后的话呢,我们这时候再去做这个debug。哎,直接呢,这不就蹦到这儿来了,然后呢,你就可以直接点这个,诶下一行是吧,到这儿了,好,到这儿的话呢,你不要点这个step into了。那这个呢,显然呢,就。略过了是吧,诶默认的行为呢,就是他不会看系统源码的啊,这个你说我重来。啊,这是呢,下一行,然后这是我们去点这个强制进入。这时候呢,其实你就看到了哟,它调的是这个参数的方法,这里边又调这个方法了,叫Y6恶五,你就这时候感兴趣说Y6物到底怎么写的,这又是一个源码了,所以还点这个false啊点进来。好,你就看到了你传进来的这个数组的话呢,它也不是个no,它就直接调图斯人了,那默认情况下呢,就是打印地址值哦,你说原来如此是吧,这个呢,我们就退出了啊,跳出这个方法再跳出这不就回来了吗。好,现在呢,已经很清楚了,现在呢,我们这个光标呢,上面一个执行完了不就跑到这儿了,我们再看下一行,这个时候呢,我再看一下它里边怎么做的,诶强制进入一下,发现,哎哟,你这是个差型数组。
15:04
啊,其实呢,你用的方法呢,都不是一个,呃,下边你要感兴趣看呢,你就点一个这个下一步哎,对这个方法感兴趣,那你就强制进入啊去分析呢就可以了。啊,如果呢,比较清晰了,那这块其实打印的就是把这个数据呢,给遍历了一下啊,所以默认呢,打印的不是地址值啊,啊清楚了你就再跳出来,跳出来那就回来了。然后再往后执行就结束了。好,这个呢,就是我们说的这个基本的这样的一个断点调试的功能啊,我讲的话呢,其实也就这样一说,大家呢,还是得下来呢,针对针对于具体的情况,你得自己测啊,哎,自己操作操作才有感觉。好,那这呢是我们说的这个叫行断点啊,在相应的直行行的话呢,你去加这个断点就可以了,然后来看这个第二个啊。第二这块我写的这个代码量稍微的大一点啊,这个话呢,我们来说一下,这个叫方法断点啊。什么叫方法断点?那先简单看一下我这里边儿写的相关的一些这个代码啊,我把这几个呢,先注释一下啊,把这个呢先打开。
16:04
嗯,这呢有这样的几个关系啊,哎,先稍微的关注一下,这呢是有一个father类丧呢,继承于这个father类了,方法呢进行了一个重启。然后呢,这有一个接口。啊,有个抽样方法,然后接口呢,提供了一个实现类,啊这个方法呢,也进行了一个实现。没了,诶这样的两组好回过来,然后这块呢,我们就用了一个散对象呢,去调这个test方法,我们按住这个CTRL键呢,诶一点这个呢就知道呢,它调的实际上是这个方法了。啊,调着这个方法好,那么此时的话呢,比如我们在这个方法的声明的位置啊,你看我这块呢,点一下鼠标左键。哎,就是这样一个图形。哎,你要是在这个执行语句这块呢,点的是这个啊。哎,所以这个呢,叫做方法断点。啊,他这呢,就是还是挺人性化的啊,它用的是不同的这个形状。怕要是用颜色区分呢?万一要是程序员有的是这个色弱呀,或者色盲的就分不出来了是吧。
17:04
哎,用这个形状的话呢,应该没有这个形状弱和形状毛的吧。那就是近视了是吧?哎,行啊,诶这块呢,你看就在这个方法这块加了断点哈,那这个方法是什么意思啊,你看这个鼠标右键一下。他其实指明的就是在我们去进入这个方法的时候呢,他会停留一下。啊好,我这块呢,就。点个蛋了啊好,那么这时候的话呢,呃,我们就直接右键我去做一个debug啊,你选上面的有没有意义了啊,选这个。哎,我一执行。好,这时候大家你会发现呢,它直接呢,就停留到我们这个方法这块了,那是因为呢,我们上面呢,不是掉这个方法了吗。哎,我一掉的时候呢,它这块呢,就停到这儿了。也就是说呢,我们给方法声明这块加断点,就是看一下这个方法什么时候掉了,掉的时候呢,我就重点看这个方法的一个执行。你就加一个方法锻炼就行。那后边你要感兴趣呢,那你就一行行去执行,你要说看出来了,你这块直接跳出,这就也就结束了。
18:02
啊,这是它啊好,这是我们说的这个场景,然后啊再看。嗯,我呢把这个打开。然后把这个也打开。这儿呢,相应的就是咱们说的这个。哎,多态的场景。类的多态性啊,接口的多态性。啊,没问题啊,上面这个呢,咱们把它呢就注释吧。啊,然后这个位置我也先去了,好看一下啊,我们现在呢,如果你要是看这个啊。叫什么调用的这个方法是哪一个的话呢,比如我按住CTRL键,此时呢,我要是去点它就点到负类这了。然后这个接口也是一样啊,我们要点就点到这个接口这块了。那那我们自然而然的,比如我就在你接口这块呢,我就加上这个断点,在这个福类这块呢,我们加上这个断点方法声明处。好,然后的话呢,你看我们这块呢,去调用哈。标的时候呢,编写或者要编译的时候,认为我们调的是这个父类的,或者说这个接口中的方法,但实际执行的呢,都是子类的或者实现类的方法。
19:01
你说这时候我要是去执行会。清流吗?实际执行的不是他是吧。啊,来我们这块做一个第八个啊。嗯,好,这时候大家你会发现诶也停下来了。但这时候停的话,你发现了他停到的。是不是就这个上这块了。也就是说咱们现在是真正运行了啊,那么运行的时候呢,实际执行的就是子类重写负类方法,所以这块呢,它要跳呢,肯定是往此类这块跳了。那为什么我们是在父类这块加了断电子类这块跳了呢?因为呢,你子类呢,不把父类这个方法给覆盖了吗?哎,父类这块有个断点,所以这块你也呈现为有一个断点了。啊,就这个意思,好,这是我们说的这个继承的关系哈,那我要是点这个操作呢。他直接是不是就停到下一个可能有断点的位置,其实就蹦到这儿了是吧,诶我这一点,哎,这不就到我们这个他什么这个实线类的这个断点的位置了。
20:02
哎,就这个意思啊,诶,你要想分析呢,你就分析就行,所以呢,我们通过debug呢,你能看到真正执行的是哪个类的方法是能够看得到的啊。那这是它,然后这个位置你看一下,这有两个小球,你点一下这个呢,就是查看一下我们在当前这个代码当中都有哪些位置有断点。哎,就这个意思啊,然后下边这个呢。断联呢,加了个斜杠。就相当于把它,那就是点一下,就是让他们都失效的意思哈,那这个什么意思啊,你看我现在已经点了。它这块是起作用的啊,我们这里边儿呢,有一些这个断点,但是此时呢,你要点这个debug呢。注意你看直接就结束了啊,相当于是一个失效的状态,就所有的站点都没有起作用。有的时候你要没启动,你看一下是不是这个你一不小心点过啊。把他那打开就行了。好,这是我们说的这个关于方法断点的一个事儿啊,然后接着我们来看这个第三个啊。第三个这块呢,我们简单说一下,这个叫字段断点啊,像我们这个person里边呢,这不有这个属性吗。这个属性的话呢,我们要在这个位置上去加断点的话呢,就会跟个小眼睛一样了。
21:03
啊,又不一样了啊,你像在这这个加的话,它不是圆点嘛,在这个声明这个位置加呢,它是一个菱形是吧,在这属性这个位置加的话呢,它是一个这个符号。那这个符号呢,是什么意思呢?哎,它会在,呃,我们右键一下啊,在你去修改当前属性的时候呢。会停留一下,相当于就是想看看哪些位置修改它了。啊,那么我们上边这块呢,写一个代码,比如说我就person p new一个person,这呢,我就写一个三吧。这个这个三看一下这是一这是二啊,这个代码你看比较简单啊,显示赋值代码块赋值复杂器赋值,赋值了一个三。那现在的话呢,我们这块没有加断点哈,我是在这个字段这块加了个断点,现在呢,我们右键的去执行,诶凡是呢,修改这个属性的位置都会停下来,那么这个复制唯一这算修改吗。算,因为默认值是零对吧。
22:00
哎,所以这个是算改这个也算,这儿是不是也算。好,这是我们右键啊,你看做一个debug。所以呢,它首先要停留的话呢,是不是就直接停到这儿了。啊,因为这时候呢,你给他修改值了啊。嗯,修改值,呃这块呢,是这个ID是三,这个注意ID是三是咱们在这个构造器里边,你这不是有一个,呃,这个变量值这是三啊,当年这个对象呢,这不是叫P1吗?就这个C了。啊,这个注意当前这个对象还没创建完成啊,是我们调构造器之前呢,先有这个显示赋值的。哎,所以这块你打开这个Z呢,它这里边儿的ID呢,还是零的。这个一还没执行呢啊。好,现在呢,就停留到这儿了,然后呢,我们再找到下一个位置。走一下下一个位置呢,这不就蹦到这个代码块里了啊,此时呢,这个不就已经变成E了,上面这就执行了,这是第二个修改它的位置,然后再去到下个位置,这不就要构造器了吗。呃,一共呢,就这三个位置呢,修改了它,哎,我再点这不就结束了吗。
23:02
很好理解是吧。那如果说我们这块呢,去打印一下这个P,相当于呢,就是调它的这个twoth string方法了,这个twoth string呢,我下边也重写了啊,这里边呢,是不是不算是对ID修改了。只是算一个调用。好,那么这个时候的话呢,我们再去做一个第八个。好,那么这时候的话呢,你看跟刚才其实是一样的啊,先是显示复制点一下代码块,再点一下构造器,我再点还会停留吗。再一点呢,构造器调完了,调完以后呢,有个初始人方法的调用会停吗。不会,因为你没有修改它的值是吧,所以我一点是不是就结束了。这就结束了吗?那如果说呢,我这时候呢,右键,哎,在你访问的时候呢,也要停留一下。那是不是我们这个突死的时候就会停呀。好,我们这时候呢,再去第八个。那这时候呢,是显示负值啊走走,哎,再来啊,我再点一下看。
24:03
在这块也停留了,那是因为呢,你这块呢,也掉它了。哎,所以我们也停下来了啊,然后再点,这不就结束了吗。哎,稍微留意一下就行,好,这个呢,我们叫做关于这个成员变量的一个断点。啊就说到这儿了啊,主要呢,就大家下来呢,可以自己呢去感受感受操作一下,然后这个零四啊。这零四呢,想来演示这个叫条件断电。什么意思?这呢,我写了一个数组,从一呢一直到12这个值,然后呢,写了一个波循环,把它们做一个变历。啊,那么我们有的时候呢,会考虑一下,说在某个条件满足的情况下呢,你挺一下。比如说我在这个位置呢,加了个断点。呃,这个断点呢,我们想考虑说,呃,当你这个呃,比如说ari吧,你这个值呢,如果说能够被三整除。啊,那你挺一下。不被呃被三除不进的,你就不要停了,你就直接执行就行,所以呢,我们加上它以后呢,你看右键。
25:04
这个位置呢,可以加一个condition,就是条件的意思了,哎什么条件呢?哎,我这个ari是吧。说呢,如果你要是取模三呢,能等于零了,我希望呢,你能够挺一下。哎,这就成为一个条件的一个断点了,后边这个呢,就是关于某个线程的啊,比如说你是哪个线程的时候呢,你就停一下,咱们还没有讲多线程问题,所以先不考虑这种事儿,以后呢再再关注啊,啊这块你选中以后呢,点个赞。然后呢,我们这时候再去做一个debug。此时的话呢,在这停留了,停留的时候呢,我们看一下这个叫conso。其实你的一和二呢,已经打印了,当你是三的时候呢,这不停下来了吗?诶,所以呢,这时候呢,你可以做一些相关的分析啊,比如下一步怎么着怎么着是吧,这样。啊,那我要是我就不具体分析了啊,我再走到下一个断点的位置,你看我走一下。是不是诶345就出来,在六的时候呢,是不是又停了。
26:00
哎,然后再去执行呢,是不是到这个该九了是吧,然后再执行啊,是不是就到这个12的时候呢,这不又又停了吗。哎,这个呢,就是满足我们这叫条件断点。OK啊行,需要呢,呃,在某个条件的情况下,我去做分析,你就使用它,用不着呢,让它这个循环一遍遍先走,走到你想要的,直接加条件断点就行。最后一个啊。最后一个呢,叫做强制结束。啊强制结束,嗯什么意思,比如说我这块呢,呃,有一个输出,有个输出,然后呢,去调个他调他呢去接着呢就执行这个操作了,执行到啊某一个位置的时候呢,我已经确定这个问题是什么了。我后边呢,就不想再去测了。啊,有的人不想测,你直接点个结束不就行了吗?这个不是特别靠谱。啊,不是特别靠谱啊,比如说嗯,这块的话呢,我们在这个insert这块,比如我加了一个断点,好,这是我们去做一个叫debug。Erl方法呢,我想看一下里边,那我就点这个into就行了,进来了啊进来以后的话呢,我们接着往下一行走,诶走到这儿的时候呢,假设我已经知道是什么问题了,我就不想往后执行了。
27:09
也就是说你执行一下,那能咋着呀。呃,有的时候呢,是不想让他执行,比如说你看这里边儿我写的一个场景假设呢,我们想测试呢,是从这个客户端发送一条数据呢,到我们的后台,后台呢把这个数据呢,写入到我们这个数据库里边了。我想测试一下这里边儿啊,出现一些问题了哈,到底是怎么回事。啊,你在测的时候呢,其实已经发现问题了,那这时候呢,咱们就呃,别往里边再去写了,因为写了以后你后边还得删。我就已经发现问题了,你就别往后边继续执行了,所以呢,当你要是想把数据写入到数据表中的时候呢,这个就没必要了,因为我已经发现问题了。我就希望后边呢就不要做了。不要做的话呢。这块你又想到了,说强制停止不就完了吗?你看我,哎目前看啊,是不是有已经有一些输出了啊,是不是到这儿了吗。这个还没执行呢哈,我现在点一下这个强制停止。
28:01
你会发现呢,后边这个事儿呢,还是给做了。是吧,哎,一行没少啊,都给做了,所以呢,他不靠谱,我们再重新呢,再抵八个。诶,那么到这儿呢,我们再进入一下,然后呢,诶走到这儿,诶发现呢,这个后边呢,不用看了,已经知道什么问题了。嗯,怎么办呢?诶选中这个当前的方法呢,右键。这个是吧,是不是靠谱点一下看出来了啊。说挺靠谱的,但是呢,你看一下cons这块还没显示,接着你往后。这个我们往后走一行吧。啊,这个没写,直接点这个吧。你会发现呢,是不是这个事儿呢,照样也给做了。也是一行没少。所以呢,刚才这个操作也不靠谱。哎,再重新debug过来,点哪个靠谱呢?先进去啊,走到下一行发现问题了以后呢,右键啊非常简单,有个叫false return是吧。那你就点上它就行了,这个呢强制结束啊,这个呢,在这块呢,你再点上它,它就直接呢,从这个里边呢就跳出来了,然后呢,这个程序结束,是不是有它中间的这些呢,就没有再去做了。
29:12
诶这呢就是一个强制结束的操作啊,大家呢,熟悉一下就行了,好那么基于咱们目前讲的这个知识点的这个场景啊,诶像其他的一些比如说异常的这种调试啊,这个线上的这种调啊,咱们还没法讲,因为我们还没有讲相关的这个内容啊,讲完相关内容以后的话呢,咱们可以呢再去体会体会。啊,相对呢,大家你可以在这个前段时间就刚我录了一个小视频啊,这个你在这块你要愿意看看也行。就这呢,我讲的稍微的会详细一点哈,就是这里边儿关于这个debug的情况呢,会多一些。关了吧。你听到我自己声音感觉挺恶心的哈,啊,就就在这儿是吧,这个我讲的情况稍微的多一点啊,你想看的话,你就在这看,包括呢,我们,呃,这个课件里边呢。这个最后呢,这不是有这个插件吗。
30:00
这个差价倒挺多,我就不一个去说了。呃,然后呢,这个你要想看一下具体插件有什么作用呢?我在这里边也讲这个插件了,你愿意看你就看看啊,嗯,有一个呢,如果有的同学想刷题的话是吧。有一个插件就是扣。我看有的同学可能自己简细的想刷一刷,刷题的话,你直接在idea里边装一个插件,直接可以在里边直接呢,它就有题目就可以刷,可以运行。啊,也挺好是吧。啊,具体其他的这样一些插件,有的时候我们还没有呃,涉及到一些相关的场景啊,可能不太方便了,呃,但是有一些呢,呃,大家是可以装的,像这个呢,推荐装一下。OK啊行,别的呢就不多说了,我们就先说到这儿。
我来说两句