00:00
那这个练习呢,咱们就说到这儿了,这个后边的话呢,咱们回头再定义类的时候呢,我们这个类呢,就可能呢,会继承于咱们自己呢,定义的另外一个类,或者呢是让咱们这个定义的类呢去继承,为咱们JAVA1篇呢提供现成的类,这呢就体现了这个继承的一个结构,行,那继承以后的话呢,我们就获取了父类当中,以及父类的父类当中啊,都叫做它的这个父类了,它当中声明的这个属性或者是方法,好那关于这个继承的话呢,我们就说到这儿,在讲下边这内容之前呢,咱们先给大家讲一个叫debug调试,这呢在实际这个开发当中呢,咱们用的也是比较多的,那大家呢,打开咱们这个这个课件,在软件eclipse eclipse使用上面有个debug,这呢就我们来说一下使用eclipse呢,如何去调试我们的程序这样的一个问题,这呢我提供了一个简单的文档,大家呢也可以下来看一下这个基本的一个使用情况,这个真正我们用debug呢,这个功能其实也比较丰富,里边有很多的这个操作的按键。这呢我们。
01:00
我们先一点点引入,这呢我写了两个测试代码。这个测试代码的话呢,大家可以直接呢,把现有的这两个Java源文件呢,CTRLC直接粘过来就可以了,这呢我们去新建一个包。诶是我们这个Java包行,然后CTRLV把这两个文件呢,我们粘过来,粘过来以后呢,这里边这个代码呢,我们稍微调一下啊,CTRLDCTRL1。行这呢是我们这两个这个代码了,然后这两个代码的话呢,我们分别来看一下哈,首先第一个说呢,我这定义了一个I一个接这呢输出I和阶,接下来我们呢,定义了一个方法叫get max,通过这个方法名呢,我们知道呢,想获取这两个数的较大值,然后这块有一个e file,一个逻辑,然后得到以后呢,我们做一个输出执行一下看看。行执行完了,执行完以后呢,结果发现呢,我们得到这个max呢,显然不是I和节中的较大值,那说明我们这个程序呢,写的就有问题了,那我们这块来通过这个例子,包括下一个例子来看一下如何呢,使用eclipse的这个debug工具,然后我们进行一个调试啊那么这里边首先说一下,咱们这个程序执行完以后呢,你会发现呢,它没有报错,但是呢,这个结果呢,不是我们想要的,那那这里边儿其实呢,就像说的是,如果咱们运用这个程序呢,出现一个异常了,其实呢,这还算是好事。
02:21
我们呢,可以根据这个异常呢,比如说定位到这个40行出问题了,大家呢,直接找到我们这个代码的第40行,你看它对应的是什么异常这块呢,做一个调整,做一个修改就好了,就是相当于我们有这个异常提示呢,其实是个好事啊,反而呢,像这种问题没有异常的提示,但是呢,这个结果呢,跟我们想的不一样,这种问题呢,其实就更难办一些,那我们用这个debug呢,效果就会更好一些,当然呢,你要是程序比较大的时候,出现了这个异常的时候呢,我们也可以用debug,这是没有问题的啊。行,那么在咱们这个问题当中,这个我们如何去调试程序呢?呃,首先说一下就是调试程序呢,有两种这个主体的这个方式。
03:06
如何调试程序两个呢,主要方式第一个呢,其实就咱们在这个程序当中呢,大家呢,去写这个C语句。或者说呢,换句话呢,其实就是相当于这个硬看了啊,这个我们在执行的过程当中,那么结果呢是不对了,那么在这个过程当中,哪些步骤出问题了呢?我们只能是一边走一边看,看看呢,上边的哪一个环节当中跟我们想的不一样了,我们时不时的呢,得去加一些这个输出语句,这呢相当于也是一种调试程序的方式。只不过呢,就这种方式呢,当程序比较小的时候呢,还可以,那大家想象一下,如果我们这个这个这个项目的话呢,或者我们写这个程序有400行代码,这还不算多,那么在400行那个末尾的时候呢,不是我们想要的。那么前面的话呢,你得从头这样去捋,捋的过程当中的话呢,你要时不时的加一些c outt,那可能需要加很多行CS outt,然后找到以后呢,你还得回过来把这些c out呢都得删掉,这个呢,显然在实际开发当中呢,这个效率很差,这个不是特别实用了,呃,但是呢,对于我们刚开始学习初学者的同学来讲,如果呢,你在执行过程当中,这个不知道这个对不对,你可以加一些C的语句,打印相关的一些变量,看看呢,在中间环节是不是我们想要的一个结果,行,那第二个的话,第二个的话呢,就是使用咱们eclipse给大家去提供的这个叫哎,Debug调试。
04:27
诶,Debug这个调试功能,那么这个调试功能怎么去用呢?我这儿呢,提供了一个简单的文档,让大家来看一下,首先呢,第一个呢叫设置断点,然后呢,我们选择叫debug as Java application,这样呢去做一个操作,下边呢就是操作中常用的一些这个按钮了,那我们回过来看一下。首先的话呢,提到了这里叫设置断点,那么怎么去设置断点,我们先说一下,比如说呢,在这个代码当中,我们比较感兴趣的呢,就是我这有个输出局了啊,假设要没有的话呢,我感兴趣就这时候这个I根接目前到底是多少,然后呢,下边我们调了一下这个叫get max这个方法,那这呢,我就加了这个断点,这个断点呢,就是双击就可以了,然后你再双击呢,它就没有了。
05:13
啊,这呢,我们加上断点,那断点呢是什么意思,这个我们简单说一下,咱们程序的话呢,这个入口呢,目前都是这个没方法了,它呢看成是程序的入口,然后呢,我们整个这个没方法执行完成以后,大家可以看作是一个出口,那么从入口进来以后,一直到这个没方法执行完成,咱们原来呢是run as Java application Java application,那run as的话呢,就直接进来,一下子就执行到我们这个程序结束了。啊,那这时候呢,咱们关心的是中间环节可能会出现问题,那我们这里呢,就设置成了一个一个的小的断点,大家呢,可以理解成一个一个的小的关卡一样,小的一个关卡,就是呢,我们这个程序呢,一会儿我们再去执行的时候呢,它不是一下子就到末尾了,它先到这个小关卡这块呢停一下,然后呢,在这个关卡这块停一下,到这块关卡这停一下,就这样个情况,那我们在这个程序当中呢,你可以设置多个断点,这是没有问题的下。
06:09
或者呢,也有点类似于大家比如说是跑这个马拉松的话呢,这个呢,你可以看成是一个驿站。看成是这个驿站,然后呢,到这个驿站的时候呢,你可以稍微做一个这个休息补充的一些,补充一下这个水分或者这个营养,然后接着呢再去跑,那没有驿站的话呢,你可以就让它直接run是吧,一直跑就可以了,这呢就是我们说的这个叫断点,好,那我这里边呢,就是加了两个断点,当然呢,大家也可以在我们这个get max这个方法里边,你要感兴趣说这个max是我们想要的,呃,这个你可以相应的加一些这个断点啊,在这也可以去加的,这是没有问题的啊行,这呢,比如我就先去掉来演示一下,那么加好断电以后呢,我们点这个右键,这有一个呢叫rise不能点它了。这时候你要点rise的话呢,跟我们这个断点呢,没有任何关系,仍然呢是我们这个没方法从头一直录到尾,那现在呢,我们要选择呢,叫debug as debug as知道吧,Application点开,那这时候呢,提示我是不是要开一个叫debug这样的一个透视图,那我们选择yes。
07:15
选择yes,好,那接下来的话呢,大家就会看到这样的一个界面,这有个小抽虫一样,这呢就是我们debug的这个透视图,那这个界面当中,这是咱们目前测试的这个程序,这呢是我们这个程序执行到目前这个代码的位置的时候呢,它这个内存中加载的一些变量,当我们首次运行的时候呢,它一下子就会定位到第一个断点的位置,那在这个位置呢,就相当于停了一下,那到目前为止,我们内存当中加载过R,就是数组的这个行参,以及我们I和接对应的变量名和端量变量值呢,就都能看到,这呢奥特曼呢来显示我们当前这个类当中的一些功能,这呢是咱们这个控制行,这个控制台。好,那么接下来怎么操作,我们关心一下上面的这样几个按钮。
08:02
这样的一些按钮,我们给大家说明一下,那么首先呢,说的是这里边儿的这几个。先说这两个吧,然后这个呢叫做step over,大家把这个鼠标放在这儿呢,就能看到step over,这个大家点F6也可以,那这个一个小方块儿呢,大家可以认为呢是一行代码。那么step over呢,就是我们一行代码一行代码的往下走,就是这个意思,然后前面这个呢,叫step into。Step into呢叫into了就进入的意思是F5操作的,那这两个小框,我把它放大一下,这两个小框呢,大家可以认为是相邻的两行代码,那么这一行代码它可能是一个方法,然后我们想看看这个方法里边做了什么事,我们这个呢,就叫做into,其实非常的形象啊,那么对应的还有一个后边的,因为咱们现在还没有执行,所以后边你看不到了,就是当你into进去以后,这个呢,就是从里边出来啊,就是它的一个这个一个进去,一个出来,一个逆过程。
09:01
好,那其他这几个呢,我们等一下再说。这几个操作呢,咱们在这个呃,Word当中给大家呢,也写了行,那回过来咱们的代码呢,执行到这一步了,我想接着让它往下走,所以我们可以先去点这个叫step,点一下这就执行到下一行代码了,呃,那注意这时候只是到这一行还没有执行的啊,然后再点上面这一行就执行了,我们看到这个内存当中呢,又帮我们创建了一个对象,就是添加了一个变量了,然后再接下来呢,这时候光标呢,执行到这儿了,我们现在比较感兴趣的呢,是这个get max到底这个方法,这个执行的结果是多少是吧,这个时候大家注意了。如果我点这个叫step over的话呢,它就仍然会执行下一行语句,那我们点一下好,这是大家看到了,它就会蹦到这个叫sit sit out这样的一个操作了,然后关于我们这个max的话呢,你也看到这个结果是十。这呢是我们点的叫step over,就是一行一行的,那我再点一下这个程序就结束了。
10:01
这就输出这个结果了,行,那结束的话呢,大家可以这个我们先点一下它吧,啊,这个直接让它终止这个操作一会再说。好,那我再重新进来,重新进来的话呢,大家就直接看这一个叫小臭虫,这叫debug了啊,我们点开以后呢,大家直接还去操作,我们这个叫debug。啊,打开还是咱们刚才说的这个程序啊,我又把它跑起来了,跑起来以后呢,现在又指向我们这样一行。又指向它了,然后我还接着往下走啊,再接着往下走,到这儿的时候。到这的时候呢,我不点这个下一行了,我现在关心的是getmax里边是什么样子的,那此时呢,我就点这个叫step into了,好,我点一下大家看到此时呢,我们就进入到这个方法内部。放内部,然后呢,你再下一步,此时呢,定义了一个max,先是个零,然后呢,咱们这个K跟M呢,你看到这是十,这是20,然后K呢小于M,确实小于MK小于,然后再点啊,那对着呢执行这个,但是此时呢,你会发现max呢,我们是拿K来赋的值,你看K是十,Max呢现在是零,我们点一下呢,这就相当于给附上了。
11:09
诶大家看到哦,原来是这个原因,我们这个赋值操作呢,是拿的K负的值,显然呢不对,应该拿M去赋值,这时候呢,你就已经清楚了,那如果你已经清楚以后呢,大家就可以点这个操作叫step return,就是直接呢跳出我们这个getmax这个方法了啊跳出以后,跳出以后的话呢,如果这时候呢,你已经知道这个情况了,你就可以点上这个,这就是叫强制终止了,然后点这个操作呢。它是这个意思啊,如果我们当前这个程序,我后边还有断点的话,比如说啊,我后边如果还有断点呢,它就相当于是直接执行到下一个断点处,如果后面没有断点了,我们点一下呢,其实就相当于程序的一个终止。就是这样的一个原因,行,那么咱们通过刚才这个例子呢,简单的来说一下这样的几个操作按钮是怎么样一个情况,好这呢是咱们说的这个第一个问题,大家体会一下,那么接下来的话呢,我们再看一下这个练习的第二个。
12:09
第二个这题的话呢,咱们之前已经讲过了,我这呢是一个int型的数组,输出结果呢是地址值,这是一个差型数组呢,输出的结果呢是ABC。这个咱们前面说过了,就是按照咱们的理解呢,应该输出的是地址值。应该输入地址,但是呢,它输入的是这个它里边的内容,那我们就比较感兴趣,这到底是怎么回事,那我们可以在这加个断点,在这呢加个断点。这样一个情况,然后呢,我们再点右键呢,去debug as Java application OK。然后打开我们的debug透视图,Yes,进来了,那进来以后还是首先呢,就定位到执行到我们第一个断点的位置了,那这个时候的话呢,呃,我们现在这个AR呢,这都已经有了,就是内存中呢,也确实你创建了这样的一个数组了,那数组的元素呢,一共是五个啊,所以大家也能看到这儿呢,一共就五个元素啊,没有问题,分别的值也都知道,然后现在呢,我们感兴趣的是你为什么打印是地址值呢?所以我们这时候呢,可以点一个叫step into,点一个step into好点一下。
13:17
大家看到这个时候呢,我们进入到这个叫print line这个方法,这个时候的这个参数呢,是object的一个类型的,然后接下来这个一步,它就往下这样的去去执行了,就。啊,就成这么个情况啊,那借着它的话呢,我们顺便再说一个这个操作叫drop to frame,哎,Drop to frame呢,就是当我们点一下,大家会发现呢,它又回到我们这个方法的首行了。啊,这也就是说有时候我们操作的时候呢,发现诶这个没看太清楚啊,你想让他重新来,这时候你可以点一下它又回到我们这个方法的初始位置。哎,是这样一个情况,那这呢,咱们也看到了,我们print line呢,它调的是object这个参数的,我这呢也知道了,我就直接再跳出来,跳出来以后再接着往下走。
14:03
走到这儿的时候呢,我们再来进入。这个时候我们看到它掉的呢,是差型的一个数组。这是一个差型数组,那其实这时候我们就已经看出来了,那差型数组的话呢,它显然这个跟我们object类型,它这个调用的方法不一样了,所以可能这个打印出来的结果呢就不同了,所以我们再跳出来,哎,这个时候呢,大家就看到结果了,主要原因就是因为我们调用的方法不是一个。行,那咱们就把这几个操作呢,就又熟悉了一下啊,然后点一下它就相当于后边没有断点了,就自动的就结束了。行,这呢是咱们说的这个debug这个功能呢,该如何去使用啊,大家注意一下。
我来说两句