00:01
好了同学们,那咱们接下来继续吧,继续啊继续那上节课呢,我们说呢,说了一下这个异常的一个处理方式啊,有一种方式是上报的方式,就是还有一种方式是什么,我们这个。怎么了?各位在的话,打个一吧,打个零吧,来个零,扣零扣零来。在不在?喂喂喂喂。好嘞,好嘞,好嘞,好嘞。好嘞,那咱们就继续了啊继续了,那刚才说到什么呢?说到咱们处理异常呢,有两种方式,第一种方式是呢,上报的这种方式,还有一种方式是什么呢?哎,是我们这个,嗯,叫做try catch捕捉的这种方式,这两种方式呢,我们要求大家都要会啊,啊都要会。那么咱们继续啊,咱们继续看各位。
01:02
嗯。还是这个程序吧,还是这个程序啊。那么这块呢,咱们M3方法去调了,我们这个构造方法是不是,那这个路径现在是正确的对吧?应该是存在的啊,我运行一下大家看看效果。应该是men begin,先执行吧,然后执行M1 M1这块怎么着啊,M1BEGIN吧。是不是,哎,紧接着去调M2 m2这块怎么着,M2BEGIN吧,M2去调M3 M3这块是不是就执行这个就行了,执行完这个之后,接下来一个方法结束了,方法结束之后呢,接下来怎么着啊。哎,这行代码是不是M2OVER啊,然后M1O吧,是不是mano啊,是不是因为没有发生异常嘛,没有发生异常就是这样的一个执行过程啊,大家注意看。
02:00
应该是I men begin manover是不是M1M2BEGIN m2over m1over manover是不是,哎,这样执行过程我们猜的是对对的啊,那假如说现在这个路径就是错了,现在这个路径错了,各位这个路径没有,那没有的话,这里是不是就出异常了,各位就调这个方法的话,大家看这个方法是不会调另外一个构造方法,你看这个构造方法去调另外一个构造方法吧,另外的这个构造方法在执行过程当中,大家看这里是不是有一个throw new,你看又来一个新的语法,各各位看好了啊,叫throw什么。New。File not found exception,这是不是把那个异常对象就出来了,用throw不带撕啊,我之前在这写的是throw思,你看这个源代码里边有个东西叫throw。就一旦说你文件的路径是无效的。Is invalid invalid是吧,Through就会抛一个异常出去,大家看这是不是那个异常对象就扭出来,这这个是不是算公司写的代码。对吧,那抛出这个异常之后,我问大家是不是这异常就上报上去了。
03:02
这个异常处理方式有两种啊,要么在这捕捉。对吧,哎,要么怎么着啊,抛出上报嘛,他在这里选择的是上报方式吗。对吧,你想你自己抛一个,你拗一个对象自己抛一下,完了自己抓一下,有有意思吗。没意思吧,所以这块大家想,你看这是手动抛异常啊,手动抛异常是throw后边new一个异常对象,这这这就是一个异常对象,那throw抛对吧,你手动抛一个,然后你在这拆开始不做是没意思的,你抛的目的就是为了往外走,对吧,所以在这个方法声明上就写了一个throws final exception。啊,那么往上抛,往上抛,抛给了谁呢?抛给刚才这个构造方法,这个构造方法继续在这儿并没有传开始,第110行呢,并没有传开始在怎么着,Rose继继续上报,上报给谁呢?谁调我在我的M3方法去调研这个方法,所以这个异常发生之后呢,我M3的一个处理态度是什么呀?是继续往上报,你看见没有M3的处理态度啊,是上报,然后上报给谁啊,哎,M2。
04:02
M2这块呢,出现这个异常之后还是上报啊,还是上报,然后M2这块呢,哎,上报过M1 M1的处理探索还是上报啊,直到我们的问方法这块,哎,我们怎么着啊,在这捕捉了。对吧,哎,Catch给它捕捉住了啊,捕捉住了catch抓住异常。那么现在我们分析一下啊,我们这个程序哪会执行哪不会执行,我觉得这个也是比较重要的,首先第一个大家看们begin是不是执行啊,执行一去尝试尝试吧,尝试去执行M1吧,IM1啊。然后我们在M1这块呢,我们输出一个hello word啊hello word,那M1这块是不是出异常了各位。因为M1呢,执行这个M1BEGIN调M2 m2呢M2BEGIN去调M3 M3这块呢,去执行我们这个代码出异常,抛出之后,等于这行代码73出异常了,出异常之后这个代码会执行吗?记住啊。
05:01
以上。如果出现异常,这里是无法执行的。记住啊,这里这个抛了。M3在执行过程当中,这抛异常了。并且你M3方法往后这块如果有代码。这里代码也不会执行。会执行吗?不会啊,这个不会。如果出异常明白吧,啊,如果以上代码出异常,这里就。不会执行了啊,出异常这里不会执行。那这个方法就结束了。各位啊,只要出异常,这个方法就结束了。因为上报嘛。上报啊好,那么接下来这个呢,出异常了是吧,出异常之后这这还会执行吗?不会了。
06:04
啊,就抛出上报了啊,上报之后这等于出异常了呀,出异常这个就执行不到了啊,这个执行不到啊,以上代码出异常这里是无法执行的啊,就上报了啊,然后接下来M1这是不是出异常了,出异常之后记住了这个代码是不会执行的。TRY块中就中断了啊,注意啊,以上代码出现异常直接进入什么开始语句块中执行。直接进到K一块中执行啊,那M1这块大家注意了,它这出现异常之后,就相当于是你底层的这个位置出异常了吗。哪个位置,这个位置。这个方法调的是这个构造方法,这个构造方法在这拗的异常,这个异常对象是不是扭出来了,扭扭出来之后,这个异常对象一直抛一直抛,一直抛一直抛一直抛抛抛抛抛抛到这儿对吧,44行一直行出异常,一抛异常对象把异常对象的内存地址付给了E。
07:07
Catch注意啊,Catch后面这个是不是长得像一个方法的参数啊?有没有发现catch后面的好像一个方法的行参?这个是不是数据类型,这个是不是变量名。对吧,哎,这个数据类型file not found exception后边是。那么这个E呀,它等于0X1234,这个0X1234是谁的内存地址?大家注意是你当时file not file input stream这个构造方法在执行的时候,你的这个对象的内存地址。你,你有一个异常对象,实际上这个异常对象的内存地址最后付给了这个异变量。听明白了吗?各位,这个其实还是很巧妙的啊,很巧妙的啊啊这个方呃,这个分支中可以使用,易引用。
08:02
E引用啊,异引用保存的内存地址是那个异常对象是那个拗出来的啊,扭出来的异常对象的内存地址。如果在M3里面写开始方法呢?先看邓俊是怎么说的啊,在M方法里写在M方地用。就不用写了,那不跟这个一样吗。那跟这个一样啊,你为啥非得把方法特殊化呀,你不能把M方法看成M3吗?一样啊。一样一样啊。M3方法,这如果踹开始捕捉了这个异常,就等于抓住了呀,他就不会长往上抛了呀。那M2这块就会继续往下执行。就继续往下执行了。
09:03
M2和M1都不写了。M3,我再强调一下啊,跟位置没关系。同学,我再强调一下,你只要开始捕捉它,就不会上泡。只要拆开纸捕捉它,它就它就不会往往上往上抛了。各位啊,只你跟方法没关系,你写方法多少没关系,你在哪写也没关系,跟try catch有关,你只要是throw,它就是往上报,你只要是踹开始,它就是捕捉。你这块M1去调M2 m2的去调这个M3 M3出了异常之后,这段代码就不执行了,你上报了,然后呢,这出异常之后你上报了,所以这段代码就不执行了,你的M2这执行上报了异常,你这个就不执行了,然后呢,M1这诶如果出异常妥了。我们下面代码就TRY块中就不执行了,各位。
10:00
注意听我还没讲完呢啊,来这块就不执行了,接下来进到catch鱼块中执行,哎,这里其实就是你在这个catch鱼块中干什么呀?去处理异常啊,其实就在这儿啊,在catch分支中干什么。在开始分支中干什么?处理异常啊,处理异常,等这个try catch结束之后,这个程序不耽误执行,注意啊,Try catch把异常抓住之后,这里的代码会继续执行。这里代码会继续往下走,因为你已经把异常消化了,给他抓住了。会继续往上走的,但是你串语句块里面的这个代码不能执行了,因为你这出现异常就直接跳到catch一块中执行,这个执行就执行不了了。啊,我们来看看是不是这样的啊,因为这里现在路径是错误的呀。对吧,哎,这个路径是错误的啊,路径是错误的,来我们看看谁执行谁不执行啊走。
11:05
好,大家看说men begin m1begin m2begin看见了吧?哎,我们找找啊,是不是上来是men begin啊,Men begin调M1方法吧,是不是M1BEGIN啊,M1掉M2吧,M2是不是begin啊,M2是不是掉M3啊,M3这块是不是出异常了,出异常之后这个是不是并没有打印出来,出异常之后紧接着怎么着了?好,一直往上抛,抛给了谁M2 m2还是往上抛,M2这个也没有执行对吧?哎,往上抛,往上抛,抛给了M1 M1还是继续往上抛,继续抛给他闷方法闷放这边是不是捕捉住这个异常了。然后紧接着文件不存在,可能路径错误,也可能该文件被删除了,是不是这句话输出了,大家看这个hello word是不是并没有输出,这说明hello word并没有执行,是因为这出异常了,但是大家看最后一个manover是不是执行了,这个mano为什么执行呢?是因为你这TRY开始捕捉了,捕捉住的异常,捕捉住就相当于是处理掉,消化掉了,后续程序是不耽误执行的啊,如果你是上报的方式,后续是代码是不执行的啊,后续代码是不执行的。
12:06
这样的啊,来这块的话,咱们要注意啊,注意注意,只要异常没有捕捉啊,采用上报的方式啊,此方法的后续代码不会执行啊,此方法的后续代码不会执行。不会执行啊,另外需要注意串语句块中的某一行出现异常对吧?该行后面的代码不会执行啊,该行后面的代码不会执行。啊,该行后面代码不会执行,Try catch结束之后,后面代码可以执行啊,Try catch捕捉异常之后,后续代码可以执行。
13:05
啊,就是你串开一捕捉,捕捉完之后后续代码能不能执行可以,但你串一块中出异常之后续代码是不执行不了的。啊,进到catch一块中执行了,那另外呢,有同学就问老师,咱能能不能输出这个E啊,可以,你在这里如果输出这个E它会掉to string方法,明白吗?输出这个E会掉突顺方法啊来我们看看会输出什么。走。文件不存在后面那句话啊,来我们看一下,它突出重写了,这不就是这个吗。对不对,是不是这个。对吧,哎,这个啊这个。这个似层相识吧,在哪见过呀?在第二个例子里边,我给大家输出过第二个例子,大家看是不是在这里new了一个异常,然后我在这是不是system.out.print是不是打印输出啊,输出调to方法,是不是输出这个德行,然后下边又了一个number point exception是不是输出这个德啊。对吧?哎,输出这个引用的话,输出这个德行,那现在我们这块呢,出异常之后捕捉了这个异常,实际上E这个变量里边保存了内存地址,去指向那个对象,在这里呢,我们输出E的时候,这个E其实就是一个异常对象,这个异常对象在哪new的呀,是在你file input stream这个构造方法,这个构造方法里边发现文件确实不存在的时候无效,对吧?它在这s new了个异常,而这个异常对象的内存地址,哎,付给了谁啊?哎,付给了我们这个catch语句块当中的这个E变量在这个大框当中呢,我们可以对E呢进行操作啊,这就像把对象拿到了呀。
14:32
拿到了吗?是不是啊,就这个意思啊,这个意思啊,好,这是代码的一个执行顺序,各位啊,这是关于处理异常这块代码的顺序,两种方式吧,一种方式上报,一种方式是捕捉啊,哎,你看看这个程序你能不能理解啊,能不能理解到哪执行到哪不执行,到哪执行到哪不执行,为什么这个不执行对吧?因为这出异常了,这个方法就结束了。啊,这个出异常的话,这个方法就结束了,因为你这没有捕捉是上报是上报。注意啊,是上报。
15:02
一个方法体当中的代码出现异常之后。如果上报的话。啊,此方法结束,就你只要是采用上报,你这个出异常了,这个方法就跟那个return效果是一样的,明白什么意思吧,这个RETURN1执行妥了,整个这个方法就结束了。啊,就结束了。
我来说两句