00:00
下面咱们来说一下叫异常处理指令,咱们知道呢,在Java代码当中呢,我们方法体当中是有可能会出现异常的,对吧?那出现异常的话呢,我们该如何去解决,然后咱们使用了叫try catch finally这样一个结构,那么从我们自解码指令方面呢,我们看一下这个自解码是如何支持哎,这个异常处理这样的一个结构的啊,那在我们说这个结构之前啊,大家首先呢,需要捋清楚一个事儿,那就是关于我们这个异常这块的一个核心内容啊,异常这个这块的一个异常及。异常的处理。那这块的内容啊,大家首先应该做一个复习,那我们这块呢,稍微给大家呢磨叽两句啊,那这块你看我提到两个概念,一个呢叫异常,一个呢叫异常的处理,那异常这块呢,主要我们想强调就是异常的一个生成过程啊,也就说在整个我们这块内容这块呢,其实涉及到两个环节对吧,这个过程一或者叫环节一呢,称为呢叫异常对象的一个生成过程。但生成完以后呢,我们通常是不是接下来这个生成过程,其实就是用了一个对象对吧,但我们干化层面呢,咱们说叫万事万物皆对象,所以呢,异常类的对象也得需要是一个创建,但创建完以后的话呢,我们需要呢,是不是有一个关键字叫做死肉啊。
01:16
那涉及到呢,肉的方式呢,把这个异常对象呢,给它抛出出来,那这个肉的话呢,咱们是可以在代码中手动的去写一个肉,那这时候就相当于咱们叫做手动抛出对吧。就是这个异常对象的抛出过程呢,咱们分成了叫手动的方式,或者呢,还有是不是叫自动抛出啊。自动抛出呢,就好比是咱们在成语当中,比如出现了叫class cost exception了,出现这个角标越界了,出现这个算术异常了啊,那么都会自动的帮我们抛除异常,手动的话呢,比如说你不想让一个这个两个数,比如说做除法一个I一个阶,你不想让这个呃,这个被除数或者除数呢为负数,那只要它有一个是负数呢,我们就抛个异常,那正常情况下呢,它不会抛这个异常的,对吧?你像分母是零,它系统会自动抛,但是呢,如果说这个呃,分子分母都不是零,那如果是有一个出现负数了,系统不会自动抛,那我们要想抛,你就手动抛加一个。
02:15
那就是这样情况对吧,那不管是自动的手动的,那这块都涉及到一个叫through这样一个情况,然后下边呢,叫做过程二,那异常对象抛出以后呢,我们接下来需要考虑异常的处理。那异常的一个处理对吧,那异常的处理在咱们Java层面呢,是不是主要呢,叫做抓抛模型。抓抛这个抛模型,那就是抓住了你所抛出来的,那我们抛出来的一个异常对象,那我们这块呢,该如何处理呢?咱主要呢,是不是使用了叫try catch finally这样一个结构,对吧?OK,这呢,就我们提到了整个这样的两个过程,所以呢,我们在这里边讲解的话呢,也分成这样两个过程来讲解,首先呢,针对于过程一,如果呢,我们在成语当中出现了异常啊,异常的对象生成了,我们使用这个死肉关键字,在这儿呢,就对应着我们这里边儿的一个指令。
03:09
这个指令的话呢,就叫做A肉。那这个指令呢,叫做a through,就是咱们现在呢要说的这样的一个指令,那如果说呢,我们使用这个trackage family这样去处理了,那下边这个呢,是如何去体现呢?这个咱们就提到了,在以前的时候,包括咱们在上面讲这个呃,条件跳转的这个位置的时候,是不是也提到过这个结构,对吧?那以前的时候呢,我们是使用的这个叫呃,像GS2啊,像这个呃,Ret啊是吧?哎,这个相应的一些指令,但是现在的话呢,我们已经不用了啊,这块也提到了,已经被是不是叫depreated了,对吧?那现在咱们主要使用的方式呢,叫做异常表的这样方式来进行处理的。所以这块呢,我们要描述一下,那就是使用异常表。行,那首先的话呢,大家先把哎,我说的这个事儿呢先理解清楚,然后下边呢,咱们来看具体这两个过程,第一个呢,叫做抛出异常,那这样一个指令对应的叫做a throw,说在Java程序当中显示抛出异常对象的这个操作啊,我们用的是这个叫throw,显示抛出就是我们手动的意思,那这个操作呢,对应的我们自检码指令这块呢,就叫做a throw。
04:18
那使用这个来实现的这个A呢,你可以理解成还是一个引用类型,因为咱们抛出的是个对象嘛,属于引用类型对吧?那另外呢,还提到说除了咱们使用throw这个关键字抛出异常对象之外呢,障碍虚拟机是不是还规定了很多现成的一些运行使异常,比如说呢,像这个算出异常啊等等,它呢,系统会自动抛出对吧?那系统会自动抛出的话呢,这个时候它我们在看自节码指令的时候,其实就不会再有这个246这样一个关键字了,那系统呢,会自动来进行一个处理。啊是这样子的,也就是说呢,系统自动处理这个呢,咱们在代码层面呢,你看不到说诶这块怎么处理个异常呢,是吧,它没有提示了,那相对应的我们在自解码指令这块呢,也不会呈现出来这样一个指令。
05:01
行,然后呢,下边就提到了,如果一旦执行了这个A肉,它的效果呢,大家写代码应该也都见过,它的效果是不是类似于一个像return一样是吧,就相当于整个呢,就结束咱们当前这个方法了,那把你这个抛出的这个异常对象呢,就要这个数据是吧,压入到你这个调用者那个方法或者那个结构的一个操作站上。那就是这样个过程,行,那咱们先把这个抛出的这个过程呢,来看一下。抛出的这个过程看一下我这呢写了几个相应的这个代码,哎,咱们还是做一个编译先。啊,View查看一下行,首先呢,我们来看一下这个叫through zero对吧,它的一个内部结构的一个情况,那我们先看这个代码,这呢,我们传入一个I,然后根据这个I的值呢,你看它是不是零,我们来决定呢,是不是要这样的一个异常类的对象,对吧?那先这个指令的话呢,就在这儿,咱们把它那CTRLC粘一下,咱们放到咱们这个说明这里边儿给大家呢做一个分析。
06:02
这个指令的话呢,看着是不多对吧,那我们来分析一下这个过程。好来分析,那这块呢,这个方法呢,是一个非静态方法,所以第一开始的时候呢,这是个this,这都不用多说了,应该都比较熟悉了,那首先的话呢,那当然这个还有一个就是咱们这不是有一个这个叫局部变量是吧,参数,这个参数的话呢,当我们执行这个方法体的时候呢,这个I呢也已经有了。当然这I的话呢,我们得看它下它的这个具体的值,比如说它这个值在我们调用的时候呢,咱们负的这个值假设啊,现在咱们先写成是一个一,就不是个零,那我先写成这个一了。好,那我们来看一下这个具体的方法题,首先的话呢,把你这个角标为一的局部变量表的这个位置的数据啊,给我们加载到这个操作站当中,这个知识一,那这个一那就过来了,那这个线都是一个黑色的对吧。好,这个一呢就进来了,进来之后接下来接下来的话,我们来判断一下这个ENE就是non equals,就是我们看下这个一呢是不是不等于。
07:08
嗯,不等于零是吧,那一不等于零满足吧,满足的话呢,它就会进行一个跳转,跳转呢就到14了,那14诶就直接结束了。对吧,直接就结束了,那相当于这个事儿呢,这个也出战了,这就完事,那这个也确实就完事了,你这相当于写这个一整个这块也不进去就结束,对吧,那现在呢,咱们不是一现在是个零。那一开始的话呢,也是把这个零呢,我们加载进来。接下来ENE就是now equals0是不是不等于零,不等于零这个事呢,是一个false对吧,但是false不满足的话呢,我们就这个不跳转了,那就接着往下走,接着往下走,那这个零的话呢,咱们已经使用过了。嗯,这个灰色的对吧,那接下来的话呢,你看这块new啊,New就相当于这里边这个操作一样,New了一个什么呢?New了一个叫runtime exception这样的一个实例,那这个位置呢,就是真正咱们在堆里边,你不是就用了个对象嘛,那你用咱们前面已经讲到过创建指令对吧?这个开辟内存空间,创建相应类的对象,把地址值呢复过来,这个咱们举例子叫0X2233,这个呢,就咱们创建的这个runtime except这个类的一个实例。
08:15
好,然后呢,把它呢复制一份,嗯,复制一份好可以了,那这呢,就是我们说的这个复制的这个操作,再接下来呢,LDC把一个这样的字符串呢放进来,叫参数值为零,那字符串值能翻过来,当然呢,咱们这时候呢,只要是引用数据类型,在这块呢,写的其实都是低值值,对吧,我这块呢字符串我就呃要不都写地址值就有点大家可能就有点懵了,是吧,那我就把这个字符串呢,我就写到这儿了,参数值为零,但是你注意咱这块呢实际意呃字符串的这个实际内容是不是应该在字符串常量值里边,咱这呢,其实还是个地址值啊,注意还是个地址值,我只不过这块呢,为了大家方便看,我就把这个字符串写到这儿了,咱们之前的时候呢,遇到这种场景也是同样的道理。都是放在地址。
09:00
引用类型嘛,对吧,那再接下来的话呢,我们调用叫special这个呢,主要涉及到这个类这个实例的构造器方法。然后调我们这个应力的方法,那这两个结果是不是就出去了。嗯,出去了对吧,然后再接下来呢,叫a through,那就接接往下走呗,那一旦执行就是现在你已经进入这个一一复语句了,那下边这个操作呢,就都会执行,那这个a through的话呢,它就会将咱们刚才这个是runtime exception的一个实例,把它呢叫A肉,就整个呢,就相当于是抛出这个,你出去之后呢,整个不管你当前这个操作战斗中还有没有数据呢,整个这个战争。啊,就是你这个方法对应的这个战争就全部结束了,然后你看在哪调用的这个结构,把你这个呃,异常的对象呢,就相当于放到人家那个调用者的那个战争的操作是站当中给压进去,就是把它呢就压进去了。那就是这个意思,那这个相应的你这个结构呢,不也就结束了吗?那这是我们说的这样个场景啊,大家应该能理解这个过程对吧。
10:02
好,那我们再看下边这个例子,下边例子的话呢,我首先把它呢去掉。那我把这个去掉,把这个去掉之后呢,我们再做一个recon,那其实这块大家你看代码呢,你会发现其实没什么区别,对吧,只不过呢,由这个零呢,我换成了一而已。那从零换成了121,那这块对应的这个细节呢,其实变化不大,比如说刚才这个代码,我们把它呢定义一下。然后把这个呢,我们过来这个刷新一下,行刷新了对吧,刷新完以后呢,大家你看一下这个具体的这个细节过程啊,当然这个好像有点区别,就是这里边儿直接呢跟这个零去比,咱们上面已经是零了,下边这个因为是跟一比嘛,所以我们需要用到那个就是这个我们讲的这个这组值零了。是不是叫比较条件跳转指令对吧?哎,所以这块呢,用的是这个的这个操作了,但是核心的这个意思是不变的,是不是下边还是这样的一个操作。你看从这个new done开始啊,到后边是不是都一样,主要呢,就是我们这个比较的时候呢,这个是用的它,而这个呢,我们用的是它,对吧?这个呢,不用多说,这个咱们刚才已经讲过了,我就不具体化这个事儿了,从代码上来看呢,不就是这个区别而已,那现在呢,咱们想强调的是这个问题,我们这里边儿呢,你看我肉了,咱们在这儿来看的话呢,就是肉对应的关键字在这个指令这块呢,就是A肉。
11:24
那就是它的一个呈现对吧,然后当前我们这两个方法呢,其实也都只有一个属性,是不是就是扣头属性啊对吧,扣头属性,然后这呢就是叫异常表,那现在呢,都没有,因为咱们也没有写踹开对吧?啊,也没有写踹开行,那现在呢,我想说的是这个问题。我在这块呢,来一个肉啊,叫做runtime exception。在方法的声明处,我们指明了你声明的异常的类型叫做runtime exception,那这时候呢,大家你再看一下我们加跟不加的这个区别在哪,我重新做一个编译。
12:01
好,大家主要呢,看我们这个throw one看它对吧,刷新一下看到了吧,这个呢,是不是又多了一个属性吧,这个属性呢,就叫做exceptions,那这里边儿呢,就记录了咱们当前我们声明的这个异常叫runtime exception。那这个呢,加S说明可能有多个,因为咱们知道呢,在这个位置咱们是不是还可以去逗号一下,比如说加上一个叫,嗯,比如说叫IO吧,哎,Exception那是也可以的,对吧,那这时候比如我们再重新做一个reel。啊,这时候我们再过来做一个刷新,那这时候大家会发现就有两个了,所以这个呢,S是一个复数的意思,对吧?哎,是个复数的意思,那这呢,我们想强调的事儿是什么呢?就是咱们看的这个扣的属性。它呢,刻画的是不是说是这个方法体对吧?它刻画的是方法体,所以呢,咱们这个肉本身也是用在方法体里的,它翻译过来呢,对应的叫饿肉,而我们这个Rose呢,是在方法的声明处啊,就是相当于是你要真的出现这个异常的对对象了,我们就把你声明出来啊,向上继续抛,这个呢叫做roses,这个roses呢,是来刻画这个方法的,相当于是另外的一个属性。
13:16
所以呢,是跟code并列的,不会放到code里边。那这个细节大家注意一下。然后呢,我们再往下看呢,这个叫through arithme,就是对应这个,咱们举了一个非常简单的叫运营时异常,就是当分母为零的时候,对吧,那通过这个呢,想说明的点是什么呢?大家你去看这个code的时候,里边呢,你是发现不了这个叫a through的。你看没有对吧,那什么意思啊,就是说对于这种系统已经定义好的那些运行时异常,它会自动的抛出,咱们在这个自解码指令当中呢,你就看不到这样的这个对应的结构了,对吧?哎,对应的结构就没有了,咱们也没写拆开,所以这个位置也看不到这个异常表。行,那通过这几个例子呢,大家去体会一下咱们说的这个,呃,关于A肉啊,它的一个这个描述情况。
我来说两句