00:00
OK啊,又是新的一天啊,首先呢,咱们把这个第九章这个内容呢,咱们做一个复习啊,第九章呢,我们讲了这个异常相关的一些内容,然后最后的话呢,我们还写了一个项目三,这个呢,对应的是咱们第三个阶段的这个项目,那这个项目呢,相当于前面两个项目的话呢,代码量呢就大一些了。啊,还是那意思啊,但项目的话呢,大家不是特别着急去写,诶后边呢,根据自己的时间呢来控制就可以了,然后主要呢,还是把当天咱们讲的这个知识点呢,这块呢要熟悉啊OK。行,那这块呢,首先咱们还是复习一下,哎,找到我们这个零三,哎,找到异常处理。好,那么这一章的话呢,相对来说这个内容啊,不太通啊,呃,也比较集中是吧,就是来考虑我们整个呢,在Java呢,开发过程当中涉及到一些异常该如何呢去进行处理的问题了,主要呢,我们讲了这么几个事儿啊,回忆一下。第一个的话呢,相当于叫异常的一个概述啊,对整个的异常的情况我们有一个了解,然后其次的话呢,我们说的叫啊异常的一个体系结构。
01:01
啊,就相当于整个呢,涉及到了相关的API这样的有一个架构啊及叫常见的异常。诶这块呢,我们还是有必要呢去熟悉一下呢,咱们熟悉的一个主要目的呢,就是大家遇到相关的异常的时候呢,你得知道它是什么原因造成的啊,进而呢,便于我们去这个接下来去改这个代码啊OK。啊,这是我们说的这个第二个点,然后第三的话呢,我们就涉及到比较重要的一个事儿了啊,既然呢,你都知道有这些异常了,尤其呢,对于一些编译是异常,咱们说呢,是一定要提前进行一个处理的,所以呢,下边就涉及到异常处理的方式啊。诶这块呢,很显然呢,我们就讲了两种处理的方式,好,那么异常处理的方式呢,也是咱们这一章的一个核心问题,这完了以后呢,后边呢,我们现在又诶补充的两个内容,或者顺延的两个内容什么呀,说呢你这个异常啊,这个一般呢,我们上面产生的都是自动产生的。啊,你不满足相应的程序的某个条件的情况下呢,自动就产生了,那除了自动产生之外呢,我们在实际开发当中,这个在某一些实际情况下呢,可能还会有一些条件。
02:08
比如像我们做那个练习当中,涉及到说分子分母要求呢,都不能为负数,像这种条件的话呢,诶不系统呢就不会给我们加上了啊,系统上只会加上分母为零的这样的场景了。所以那对于分子分母如果为负数呢,你是不允许的,我们可以呢,自己让它抛出异常,所以呢,下边第四个问题呢,就是手动。哎,抛出那异常对象。啊,这个问题啊,好,那么这是第四个,然后第五个。啊,第五个,然后呢,手动抛出异常对象呢,我们抛出的呢,可以是现有的这个异常体系结构当中的一个异常。但在实际开发当中啊,我们说呃,异常呢,其实这个名呢也挺重要的,我们一看这个名叫控制人异常,那我们知道就出现控制人了。啊,一看这个呢,出现那个叫number format exception啊,你知道呢,是像字符串呢,跟这个基本数据类型之间转换呢,出现了问题了,所以呢,这个名啊也挺重要的。
03:02
所以呢,导致我们在实际开发当中,针对你具体的这个业务情况啊,如果呢,你要是手动抛出异常对象的话呢,很多时候呢,我们抛出这个异常的对象都是我们自定义的,所以最后一个问题就是如何。哎,自定义异常类。诶如何自定义异常类是吧,哎这样一个情况,这呢,就是咱们整个这一章呢,讲的这样的几个问题比较集中的行,那么在后续咱们这些章节当中啊,都会去使用这个异常的。到时候呢,大家再通过使用呢,再熟悉熟悉啊。好,那么第一个问题啊,叫异常的一个概述这块呢,我们是说了这样的几个问题啊,直接咱们就粘过来了就啊。诶首先第一个问题呢,说诶什么叫异常啊,这个比较好理解,就是在程序的执行过程当中,凡是呢,出现这种非正常的情况呢,导致我们这个嗯GM呢不能正常执行了啊这种我们都可以理解为呢叫异常。
04:00
哎,但是这块你注意咱们前面也提到过了,像你这个程序当中,比如说少一个分号啊,少个大括号啊是吧?哎,像这种呢,咱们不算啊,包括呢,就是你这个是A加B,结果你写成A减B了,这种逻辑上问题呢,这也不算。啊,实际上呢,大家要去识别的话呢,非常简单,就是这个程序呢,比如我们随便打开一个程序啊,这个运营是异常呢,其实我们这边看呢,是看不太出来的。因为呢,在这块我们看idea的话呢,这个就相当于是编译的一个情况啊,编译这块呢,它是不能够呈现出来的。这块你看这呢,这也是咱们当初运行的时候呢,出的问题,它是后期给我们提示的啊,就是在一开始你编写代码时候呢,关于运营式异常,它不会提出这个编译式的问题的,然后呢,对于像这样的问题啊,比如我们把这个打开之后,呃,如果呢,你发现它这块呢,报了一个红线,然后呢,你把光标呢,往这一放的时候呢,它凡是出现了叫UN handle的exception,说什么什么异常。那这呢,它就一定是一个编译式异常了。啊,对于这种异常呢,咱们就记着接下来你要考虑处理了啊,其实就这么简单就可以了,对于呢,它这块也没有报,没有报你就不用管它就行OK啊。
05:04
行,这呢是我们说的这个异常,然后呢,异常那个抛出机制,那这边就提到了,说呢,我们程序在执行过程当中,如果出现某种异常了,这里边其实体现了咱们讲面向对象的那个词,叫万事万物皆对象。是吧,诶你出现一个异常了,那怎么去体现呢?说我们这时候呢,会抛出一个异常类的对象啊,这个异常呢,在我们这儿呢,其实也是一个对象。啊,那类对象呢,它会死肉。啊,Throw呢,就是抛出的意思啊,然后呢抛出,那你接下来呢,需要处理,所谓的处理,咱们说呢,主要用的是try catch finally的方式,其实就是补货的意思。哎,所以呢,先抛后捕获啊,捕获呢,也称为呢叫抓,所以这就是抓抛模型,哎,抓住你抛出来的啊这样一个过程。好,下边说如何对待异常,那就是我们遇到这个异常的时候呢,呃,你肯定不能说衍生呢,就看它这个自动结束了啊,我们得考虑呢,去处理它这样个情况啊。
06:02
好,这呢是我们说的一个概述,然后下边呢,就具体的关于异常的这个起义结构啊,其实也不复杂啊,就是我们下边呢,抛的这样的一个架构。哎,把它呢,CTRLC。哎,把它呢,哎这个粘过来就行。好,那这里边呢,稍微再说两句啊,整个呢,关于异常这块呢,比较顶级的一个类呢,叫做肉,它的副类呢,就是object了啊,然后它下边呢,有两个子类,一个叫error,一个叫exception。这个呢,咱们就翻译成叫错误啊,这个呢就叫异常了,所以我们这章的异常处理呢,其实针对的是它。啊,然后这个呢就不处理了啊,原因呢,就是因为它是比较严重的问题,这个一旦出现相关的异常以后,这个咱们根本的虚拟机也搞不定,你都溢出了,我这块呢,没法给你再清空,但是这块呢又不能清啊。是吧,那当然这个站这块呢,本身JC也不会去给大家去做处理的啊,那考虑这个比如说堆空间啊,那这空间呢,你已经溢出了,那这个数据的话呢,我们这个GC你再去判断,发现这个引用呢,确实也要使用,那我没办法帮你去清空,反正这时候GM呢,整个就挂掉了。
07:07
啊,解决不了是吧。哎,所以这块呢,大家遇到这样的问题,如果出现了的话呢,你得看看到底是什么原因导致的,我们去相应的去修改我们的程序了就得啊。好,那下面就提到异常处理,其实说的是他。那咱们也都讲过后边内容了哈,呃,真正意义上我们要处理的话呢,其实说它呢,也不够精准。啊,因为呢,运行时一长,其实也不处理是吧。啊,因为这种的处理的话呢,你想我们在程序当中有光说一个控制人异常,这个就是大量出现的。凡是你带一个点。后边调个方法,调个属性,点前面的那个结构啊,如果是一个对象的话呢,那都有可能是控制帧的。那根本也处理不过来啊,所以说呢,就是运营是异常呢,首先呢,我们要处理,你也处理不过来,实在是太多了,太常见了,这是其一。当然这个呢是其次的啊,主要原因呢,就是你你处理的话呢,它其实比如我们调这个print sta也是打印的对战信息,哎,我们不不去处理呢,也是打印对战信息。
08:09
啊,所以这块呢,我们就不用处理,直接就啊让它运行,如果出现了,那就说明呢,你这个程序呢,是有问题的,会过去改代码。啊,就这样就行,那对于这个编译式异常呢,我们必须要提前呢,给他写一个拆开,比如说。啊,因为你要不写呢,编译根本就过不了。好,编译过了啊,我处理了编译过了,然后运营的时候呢,没出异常,那就正常执行出了出了还得回来考虑改代码。啊,那我们处理的意义在哪呢?诶处理意义呢,就是万一呢,在这次你比如说我们这个fire放呢,确实呢是没有这个文件了,然后呢,我们给出了一种处理方案啊,你比如说你相应的这块,在我们这个比如以客户端为例哈。放在这个用户呢,现在他假设有个按钮,他一点他要读它本地的一个本地的一个文件是吧,假设这个文件在呢,呃,这个呢,就没有任何的异常,正常呢,就比如说显示出来了,假设呢,比如说就在下边啊,显示出来你这个文件的数据了啊,那如果说这块呢,你点击。
09:08
发现呢,这个本地这个文件呢,不存在。那这个时候的话呢,你不能给用户抛一堆这个咱们说叫异常信息了是吧,这个呢,用户呢,也看不懂啊,那这时候呢,你要出现这个异常的时候呢,咱们提前呢,在代码里边呢,写上这个try catch。它的意义呢,就在于万一要出现这异常了,我们可以给用户一个比较好的一个提示啊,比如这块呢,一个小孩往这一坐是吧,就跟哭一样说哎,这个本地找不到这个文件了。这个呢,就相当于我们的一种处理方式了。啊,那么用户的话呢,觉得诶体验还挺好是吧?诶那相应的话呢,这个有这个异常信息以后呢,这个异常信息咱们也可以通过网络的方式呢,就发送给这个应用的后台了,然后呢,作为一个日志信息呢,就记录下来,那后边的话呢,我们再去看一看是吧,程序员去看一看,看这些错误信息到底是哪些原因造成的,适当的,你看是程序的问题,那我们相信的话呢,你得解决一下。
10:00
哎,这样个场景哈,相当于呢,Track呢,就是呃,提供了我们一种就万一出现异常的一种处理方案,那真正呢,如果是代码的问题,或者其他的什么问题,我们呢,后期呢还得是考虑诶。这个在代码上呢,去做一个调整的啊OK。好,这个呢,就是我们说的啊,真正异常处理其实就定位到这儿了。啊,这个大家注意一下啊。OK,呃,这儿呢,我们也提到了,有常见的这个企业的这个面试企是吧,这个咱们是说到这儿了哈,哎,这个面试题的话呢,咱们是这样说的。哎,这块大家稍微再关注一下。哎,就这样啊,哎,如果说呢,大家目前就找工作的时候呢,说你都常见有哪些异常了,这时候你就从这里边去挑,其实就可以了。哎,当然了,一般要大家说的话呢,通常啊,都会先举这种运营式一。啊,因为呢,开发当中咱们这种异还是比较常见的啊,然后这种异常的话呢,其实你也可以来去举,包括呢,咱们后续开发过程当中还会遇到好多这种异常需要处理的,到时候你稍微再混个脸熟是吧,也可以呢,去提一提啊。
11:02
哎,三年以上的这个我们说了,你就得说这种比较高级了,所以这块呢,说这个常见的异常,这个异常呢,你就不要局限于说,诶是不是就是翻译成这个词了。啊,这个呢,其实把艾瑞啊等等这个咱也就都归到哈,泛泛的讲,这都算叫异常了。啊,所以说这块呢,以后再说,就是说这种比较高级的了,主要就是这个。这个当时呢,举例的时候呢,你看还有没有印象啊。这个我们在这这个举例的时候呢,它后边有个冒号啊,这个叫堆空间溢出了,那其实呢,它这个呢,Auto memory啊OM呢,它其实有好多的情况。啊,都可以去说的啊,不光是这一个。那暂且的话呢,咱们没有讲后边GM这个课啊,所以说这块呢,咱们就不多去说这个事儿了,那就先过了。好,下边呢叫异常处理的方式。看异常处理的方式。呃,这块的话呢,我从这个出发啊。嗯,从从这,从这出发。咱们来看呢,比较好一点,就整个呢,咱们这一章呢,讲的内容啊,其实可以呢,从这个呃,两个过程上来讲呢,去说明。
12:07
第一个过程呢,叫做抛,哎,可以自动抛,可以手动抛,第二个过程呢,叫做抓,这个抓呢,其实就是捕获。嗯,不过呢,严格来讲呢,其实就是我们说的catch啊,所以说呢,这个抓泡沫模型呢,其实主要说的就是try catch的方式呢,来处理一场,但是咱们也可以把这个事儿呢给它,呃,再拓展一下是吧,范泛来讲呢,这个抓呢,咱们就理解成是一种处理吧,要这样讲的话呢,其实对应的就是两种方式了。哎,所以异常处理的try catch throw啊这样。的两种方式啊,所以这块呢,从诶CTRLC一下啊,从整个的咱们来讲,我就把它放到咱们的这个位置了啊。哎,这个往前给他拽一下。这么着啊。啊,这个呢,就得是换行了啊好,那么从这两个过程来说呢,咱们异常处理呢,其实是先说的是这个过程二,呃,因为呢,过程一呢,咱们呃,一开始的时候先是以这种自动抛呢来去这个举例的啊OK。
13:03
行,那么这里边儿呢,具体来说啊,这个3.1,那就是踹。啊,开始。Finally是看他,然后再具体的。啊,这就是Rose。哎,就它了啊。好,那么这是两种方式刷干翻类的话呢,需要大家重点来掌握的,那因为呢,它是真正意义上把这个异常给处理掉了。那咱们是在这儿写的啊,这块呢,大家主要需要关注的算是两个事儿吧,第一个呢,就是基本的try catch。那它呢,就属于我们一个呢,叫可能出现异常了,它就抛出了啊死肉了,其实这块啊,然后呢,这块呢,就补货了啊,然后在大块里边给处理了。啊,主要的是这个这个finally类的话呢,属于呢,在一些特殊场景下呢,需要我们引入的,那就是说呢,有一些必须要执行的代码,我们就把它写在finally当中啊常常呢,就是我们说的一些资源,需要关闭的一些资源的时候。
14:00
哎,这样的问题,所以这块呢,算是两个事儿啊,第一个呢,就是基本的try catch的使用。啊,这个我们是。哎,写的这个内容是吧。啊,这个呢算是两个问题啊,这是算第一个问题。哎,我这写成一,这写成二啊这个呢,就是基本的track的使用,大家呢,熟悉熟悉,然后第二的话呢,就刚才提到说关于finally的一个使用。啊,他的理解什么样代码需要放在分类当中啊,这是我们说的第二个事儿。啊,不太复杂啊。哎,张过来,这个就还写成是写成三吧。哎,3.13.2,哎这就可以了啊行,这个呢就过了,哎就过了啊好,然后呢,下边是这个叫roses,这个roses呢,就是写说成叫抛出了是吧,下边这个也叫抛出,所以呢,在这个翻译过来这个词汇上呢,稍微显得有点乏力了,就是这个呢叫抛出,这个抛出的话呢。是不是应该叫死肉啊?对啊。所以这俩呢,就千万不要给混了。
15:00
所以呢,这也是一道面试题是吧,来问你他俩有什么区别,咱们呢,上课的时候呢,这不也提这个事儿了。这个Rose的话呢,咱们也提到了,他呢,不算是真正意义上把这一场给处理掉了。他只是呢表示说,诶我当前这个方法呢,不知道该怎么处理啊,我圈开始呢不合适,我就呢继续向上。抛出啊,由这个方法的调用者。这个所谓的雕者指的是谁呀?就是这个调这个方法的另外一个方法是吧,你比如我们那个METHODS2啊,METHODS2呢,它出现异常了,它就选择呢是Rose。继续往上抛出,抛给了他的调用者,这个交用者指的就是METHOD3。那M3的话呢,你得再考虑你怎么处理这呢,他选择了catch。就是相当于呢,这个理解一下这个事儿。好,那回过来啊,这个呢叫Rose啊,大家需要清楚的就是它的基本的这种格式是吧,是不是真正处理了,包括下边这个方法的重写啊,这个要求。
16:03
这儿呢,是关于他的这个知识点。比较清晰啊,比较清晰,然后呢,对于大家来讲呢,比较重要的一个事儿呢,其实就是我们开发当中,大家呢,该如何去选择track开family还是如此啊,这个我们写了这样的几个建议。哎,放到这儿了。啊,这呢是一个建议啊。嗯,开发的。哎,中的这个,哎经验之谈啊。好,这块的话呢,后边我们遇到相关的异常的时候呢,到时候咱们去按照这个标准去处理就可以了啊。行,这呢是我们说的第二种处理异常的方式啊,其实也还好啊,不是特别难,然后呢,下边就提到了,说我们在某些场景下呢,还可以自己主动的去抛一个异常的对象。啊,就是这个死肉。哎,磁肉啊,这个肉话呢,它的使用的位置这个得清楚。在方法内是吧。我这儿没洗啊。啊,在这了是吧,在方案的内部满足指定条件呢,你就使用肉异常类的对象方式,把这个异常给它抛出,它呢,对应的是我们这个抛的这个过程的这个。
17:08
哎,这是他啊,行,那你抛了,抛了你就得考虑抓。那只不过呢,这是我们说你要抛的是一个,呃,运行时异常的对象的话呢,那就不用抓了,因为呢,运行时异常咱也不处理啊,你要是一个编译是异常的话,那这就是一定要考虑这种或者是这种来处理的。就这俩。那这要注意点啊。行,所以这块的话呢,我们就直接呢,就相当于是一个他是就可以了。哎,就他啊行,咱们在这个相关的题目当中,其实也都见过了,包括呢,咱们写这个项目的时候是吧,添加这个员工到这个开发团队的时候呢,是不是有好多种不满足的情况,当时呢,咱们用的都是死肉。那因为呢,这就是你具体的问题了,这个问题的话呢,你说哎,只能添加一个架构师,当你添加第二个架构师的时候呢,我们就抛一个异常对象。这个都是你个性化的这样的一些要求啊,我们就用死肉主动的去抛。
18:03
好,这个呢,就没啥可说的了啊,画完以后呢,该处理了,那就看还是看上边这两种处理方式就行。啊,这就它啊行,然后再下边一个,刚才我们这个抛的话呢,异常类的对象可以是现有的异常类,也可以是自定义的,下边就涉及到了该如何自定义。这个呢,其实也比较简单啊,这个你就看看这个exception它咋定义的,咱们就也跟着怎么定义就可以了。哎,他们呢,这些都是继承为现有的异常体系,其实本质上来说的话呢,大家只要是跟这个RO。你看这个单词呢,叫的就挺特别是吧,哎,这个呢叫throw就可抛出的嘛,所以说这块呢,我们就可以在方法内呢,可以去throw,哎后边呢,你加上一个异常类的对象,只要呢是这个。体系下的一个子类都可以。啊,只不过呢,我们不是也不会去继承error嘛,是吧,所以咱们都是继承这个exception这个体系了啊。然后提供几个构造器啊,提供一个全球敞量是吧,这就完事,所以这个事儿呢,本身呢,其实挺简单的,这块呢,大家在自定义的时候呢,一定要记着啊,咱们提供那个词叫建明之意。
19:11
啊,咱主要目的呢,其实就想看这个名了啊,下边呢,所以就涉及到问题,说我们为什么要自定义长类呢。啊,其实呢,就是主要呢,关心的就是它这个名。啊,一看这名,那就知道它是什么的问题。就是这样一个场景,哎,回过来。那就这个事儿。啊,这就完事了啊,所以呢,整个咱们这章这个呃,内容的话呢,其实捋一下的话呢,就是。这样几个事儿,第一个常见异常,大家这块呢,你得记一记。然后第二个异常处理两种方式得熟悉,这是重点,然后后边这两个呢,算是有效的补充内容啊,我们可以呢去肉。然后呢的呢,通常呢,哎,都是一个自定义的异常类了。就这样个情况啊。这个呢,我们就过了。哎,这就过了啊,然后呢,我在这个课件当中。
20:00
啊,在这个回过来啊。异常处理,哎,这个打开。哎,我这里边儿也放了一个,像一个小结一样哈,就整个呢,这一章呢,咱们捋一捋,其实就讲了这样的几个关键字啊,哎,算是有五个了。那五个关键字呢,对应的就是track finally啊,异常处理的第一种方式,第二种呢,就是叫Rose啊,两种方式。然后呢,我们还可以呢,去,呃,主动的抛一个异常类的对象用,那叫死肉是吧。哎,这样个情况啊,那这俩的区别。啊,咱们提过了,你就可以呢,用这句话呢去体会。啊,就行啊。后边这块呢,有两个这个。找的两段这个这个挺有意思的这个东西哈,大家可以感受感受是吧,最遥远的距离啊,我在if,你在O里边啊,这两张碰不了头是吧。啊,最痴心的等待啊,Switch kiss啊,等着呢去匹配呢是吧?啊,最真情的相依啊,TRY和catch,然后呢,还有find啊,哎,这个咱们学过Java以后呢,一看应该是很清晰的啊哎,后边这块呢,是把这个死了都要爱给改了是吧?
21:07
改成开了啊。啊OK,好这呢,咱们这一章就算是结束了啊,最后呢,咱们写这个项目的话呢,大家根据自己的经历情况来写就OK了啊好,然后呢,我们看一看这个真题。啊捋捋啊,看这块都有哪些问题啊,这第一个啊说Java的的异常体系呢,简单介绍一下啊,仅仅的接口是谁啊,继承关系啊,下边都有哪些类,其实上就咱们说的第一个问题。哎,第二个问题了啊,就就这了啊。哎,所以呢,一看这就比较清晰了啊,所以这块呢,就就略了呗。哎,紧急的,其实这个接口不合适了。就是这个类是吧。嗯,OK啊好,下边这个Java的异常处理的机制。这不就是我们讲的第三个问题,这是吧,哎,两种处理方案啊。哎,方案是吧,这个呢,也比较简单啊开始。
22:00
Finally是吧,再就是Rose是吧,记着啊。行,这就过了,下边说异常的两种类型,你看这个异常呢,它其实就泛泛的理解了。就是类似于说叫RO了啊,所以你看他把error呢,其实也放到里边了啊,一个呢叫error,一个叫exception,说他们的区别是什么。那这个咱们在这边内容当中也非常清晰的写了。啊,这块。啊,这个是吧,哎,这是他俩的这个区别啊。好,所以这块呢,咱们也就略了。好,下边呢,说运行时异常,就我们说的runtime exception跟一般的异常有何异同?你啥意思啊?嗯。都是异常是吧,这个运营是异常呢,它这里边说的呢,就是runtime。这个exception。哎,说的就是它了啊,然后呢,它这个所谓的叫一般异常。这个。
23:00
其实呢,他想说的呢,就是这个啊。就我们这个。对哈,这个呢,就理解成叫一般的了,在这个运营式异常的话呢,首先呢,我们说呢,它是编译是可以通过的是吧。嗯,这个我们这样写啊。哎,编译可以通过,然后呢,在运行时。可能抛出的可能抛出。哎,可能会出现的啊,这叫运营式异常,所以它的再主要的特点呢,就是一般。呃,先说这个是吧,就是相较于我们说的一般的异常,或者呢,就是非运营式异常的异常来讲,他们呢,出现的概率呢,就相对来说高一些啊。就是一般的咱们这个运营式异常呢,大家可能会经常见啊,然后那个一般的这种编译式异常呢,可能会相对少见一些啊,所以它出现的概率高一些。呃,另外一个点呢,就是说我们一般是吧。这个对于运营时异常是不是通常都不处理了?啊,对。
24:01
啊,针对于。啊,运营是异常。哎,都不处理了,哎,就是如果你运行出现这个运势异常了,这个你回去你看看代码哪块有问题,去调一下代码OK啊好,那么一般的异常。一般异常,那就是一般了呗。啊呃,这个呢,如果说我们这个说非运行时异常的理解成一般的话呢,那这个呢,就是在编译过程是吧。或者你编译的话呢,它就不通过了啊。那必须。就相当于要求。必须在啊编译之前。啊,然后呢,考虑异常的处理。啊,不处理编译不通过啊。哎,这就是这样个情况啊,那你处理的话,你可以拆开始啊,也可以肉OK。呃,然后呢,你处理以后呢,接下来编译呢,通过了,那运营时的话呢,如果没出现,那就正常结束啊,如果出现了,那就再把你这个异常呢给抛出来,然后呢,该处理再处理啊OK。
25:05
行啊,这个就是它了啊,然后下边呢,说几个你常见到的异常啊,这个呢,就是我们上面举例子,大家呢,是一到两年的,你就说编译是异常,运行是异常啊。三年以上的说那OM了就得是吧。哎,所以这个列了啊。好在下边。说呢,Final的区别。这个没啥意思是吧,咱们也说到了啊,这个你就把各自呢说清楚就行,他们仨呢没什么共同点。啊,没有任何相似之处啊。行,这个会说吧。是吧,这个在咱们前面讲的那个final最终的是吧。对,这是拆开finally里边,你说诶finally什么意思啊,就是你把这个一定要被执行的代码放到他这里边呗,这个这个咋说呀。是一个方法名是吧。这个呢,方法它是定义在。
26:03
哪里边儿的。Object里边吧。啊,有同学都已经忘了是吧?呃,咱们面向对象呢,讲的东西其实挺多的啊,后边呢,咱们这个异常呢,这是出了面向对象的第一个章,后续呢,还有好多个章节啊,看我们这个导图的话,这不都有,然后呢,讲这些内容当中啊,遇到哪块什么样对象了,咱们到时候可以稍微的再复习复习啊。哎,不用刻意的去往这儿复习了,或者呢,大家觉得说,哎,我们阳对象理解的一般这个呢,通过后边这个应用呢,大家再去啊,往前面这样去导这些知识。啊,这样的话你才能有更好的一个理解啊。这个呢,是咱们在object里边讲的一个方法,这个方法什么时候执行还记得不?就是当诶这不是咱们相应的这一个类是吧,任何类的话呢,都是直接或间接的去继承U扎,所以呢,就是你不重启的话呢,也会有这个方法啊哎,当这个对象这个类的这个对象。
27:01
要被GC回收的时候是吧,在死之前呢,相当于说你有什么遗言没有。啊,其实就相当于你最后呢,要调一个方法,这个方法呢,就是你当前这个类的对象呢,要调的这个finalize方法。就掉它了啊行,那这个呢,大家了解来就行啊,为啥呢,因为这个方法呢,在JDK9的时候呢。是已经被ated了是吧?哎,不用了啊,行,这就它了,说下边说,如果呢,要是不使用try catch程序呢,会出现异常,会如何处理啊。那你不使用拆开。那头人死肉死了。哈哈。嗯,不使用,开始我使用Rose是吧。哎,死肉其实也不是一个根本上把这异常给解决掉的方案,是吧,只是说呢,我继续往上抛。啊,但是你要说呢,咱们写程序,比如说哈,咱们找我找找谁找肉啊。不对,我找死肉。诶大家看啊呃,咱们这个me的,我就不不考虑ME3了,看这个哎,ME1呢死Rose死了,给了ME2了,ME2也死Rose死了,然后呢,到这块的时候呢,在没方法里边假设我就把这个给注掉了是吧。
28:10
然后这块呢,咱们不是调了一个METHOD2吗。哎,这样一掉这块呢,显然你会死过来,这块呢,如果我不踹开始,那就接着呢去往上再抛呗。哎,我out回车一下,然后再点一下,直接就跑这了。啊,这个抛呢,他就只写了一个,那相当于呢,他是认为呢,这个fair not for exception呢,相当于它是他的一个子类了,他就只抛了一个父类的这个类型,啊抛这了行,在这儿呢,确实是死了。啊,然后呢,这个程序呢,这块呢,看也没有变异式的异常了,相当于我这时候就可以呢去运行了,一运行可能真就挂了。啊,这样的场景啊,呃,当然呢,咱们说一般不会这样去处理是吧。啊,就是你已经到这个没方法这块了,就不要想着再去给它做一个哎四周了啊。行,那对于我们说这个程序当中,你要不使用track呢,使用throws呢,针对于当前这个方法呢,相当于反正不出现了。
29:02
啊,当然呢,真要出现的话呢,那就。再抛给调用者了啊,最终目的呢,就是会如何呢?那就是程序就挂掉了是吧。也就是说你不使用try catch啊,这个对于这样说吧,对于当前方法来讲。啊,如果不使用catch啊。嗯。哎,则在出现异常以后啊,这个异常对象以后啊。啊,以后啊,会相当于呢,就是呃,抛出此对象。啊,如果啊没有啊,这个相当于这个处理方案是吧。哎,方案啊,那么就会。这个中止。哎,程序的执行。哎,这样个情况啊好,这个呢,就是我们说的这样的一个情况,所以呢,咱们,嗯,你得考虑这个最终的得圈开始去处理啊,包括呢,在没方法这块呢,你要不处理的话呢,这不是整个程序就挂掉了啊,所以最终呢就是会终止程序啊。
30:10
好,那么呢,捕获的是什么异常?不过什么异常啊?嗯,这个编译实际上运营其实也能只是看你要不要处理了是吧。这个写错了啊,这catch。就是我们说的这个。哎,针对他就行啊,非error啊。A呢,咱们不处理是吧?下面说如果呢,执行finally类代码块之前方法呢,返回了结果或者GM推出了啊,这个family块中的代码呢,还会执行吗?包括下边这个return是啥的是吧,对这块我们提到他一定会执行啊,但是这个它叫GM退出了,这块你得看看它是什么意思啊。如果呢,是想体现的说,因为返回的结果说你这个方法呢,结束了,GM要退出了,这种情况下呢,Finally是要执行的。
31:02
哎,有一个特殊情况呢,就是。对,就是我们这个system呢,它有个方法叫做是吧。退出就他是吧。啊e it,对好啊,就是当你要调这个方法话呢,这个是强行的让我们GM结束了,这种时候呢,这个就无能为力了是吧,因为强行结束了啊,那除此之外的话呢,这个我们都会去执行finally中的代码的啊下边呢也同样的道理。啊,一定会执行啊呃,那如果执行是在return前还是return后呢。嗯,这个呢,感觉还真是。好像说不明白似的是吧,来咱们这样说哈,哎,我们还是拿这个例子来讲,咱们讲这个finally的时候,是不是写这个代码了嘛,是吧,随便我们找一个哈,看这吧。啊,还不能找他,他这个,因为他又return了啊。然后咱们找找这个吧。大家看啊呃,我不管这里边写的是A也好,还是写123也好啊,我要写的A的话呢,那这块相当于出现异常了,不就蹦到这儿了吗。
32:05
是吧,哎,你说这个我们发中的代码是在乳前还是乳return后执行呢?这个应该这样说哈,因为这儿呢,我们看代码的话呢,这就一行是吧,实际上这个执行的话呢,它是分成了两个。哪两个呢?哎,就是咱们前面稍微我提过一下这个事儿哈,就是这个方法呢,首先呢,它是个战争放在我们这个站里边了。这个战争战争的话呢,它其实又分成好几个部分。呃,第一个呢,叫局部变量表,放我们这个局部变量的,另外还有一个呢,叫操作数站,就临时来存放一些运算的数据的。啊,那么这时候呢,当你去调用return负一的时候呢,它这个负一啊,它就要把它放在这个操作数站里边,它就放在这儿了。放到这以后呢,按说下一步呢,就该return,拿着这个值就出去,这个方法就结束了。但是这时候注意先别return。啊,然后呢,我们把翻中这句话执行了,执行完以后,然后把这个值呢给他拿出去。
33:04
所以呢,这个操作呢,算是我们分成了两个过程,第一个过程呢,就是先把负一放到操作站里边。第二个过程呢,哎,这个你再去让他return出去,在这两个过程中间呢,咱们穿插了finally。所以你要泛泛的说说return先还是他先啊?那咱们先按他先来算吧,因为毕竟呢,它是一定要执行的是吧,但细节来讲的话呢,其实这个呢,是拆成了两个过程,先复议,然后呢finally,然后呢采取return是吧。哎,这个注意一下啊。行,那也就意味着你看这个程序呢,我如果说给他这儿做一个编译。这个是吧,编译了啊,然后咱们看一下这个解码文件,这个叫test方法,它的点开code。哎,往这儿啊,最后大家你看一下。嗯,对,他这是可能抛出异常,A润他就在这儿。你看下边是抛异常的事了啊,咱们就不管了,因为它不是有可能会抛出异常吗。
34:02
然后呢,这个呢,就是我们所说的这个所说的这叫I return。就是说呢,他最后呢,要结束的那个操作啊,这个是从字节码指令的角度来看的啊OK。哎,这不提前了,有我们这个test结束吗。这儿是吧。那就他二。好,这呢是我们说的这个事儿,所以回过来呢,嗯,是return前还是return后执行呢。嗯。对范范来讲,那就说return前,你要具体来说的话呢,就是先是return后边那个结构的执行,然后呢再翻里,然后再去把return呢,翻译成是一个资节码指令的那个return是吧,在执行啊。好这个呢,咱们这我就略了啊。下边绷带捕获异常在开块里边一定会进入finally里吗?就是说在catch里边他又出现异常了,那这时候呢,还会执行finally吗?会是吧?对,T里边有,呃,能有return吗?可以,其实是吧,Ly return呢?还会进finally吗?会T里边是什么情况?
35:06
之前还是之前翻在里边是吧。所以这块呢,想说的就是finally呢,一定是会被执行的啊这么个事儿。下边肉和死肉丝的区别。这个咱们上课讲了,但估计很多同学还是得蒙吧。啊,这个咋说。嗯。对,你看这个大家答的时候呢,我提过两个方式啊。对,这个角度一的话呢,就先从这个形上来说,形什么意思呢?就是你使用上来说啊,这我就加个引号了。哎,这块一个。这样一个啊,从这个型号来说,就是使用的这个格式。啊鸡。使用的这个格式。这个你得先会,嗯,也就是说嗯,然后这样来写啊,这个死肉的话呢,咱们是呃,使用在方法内部是吧,然后呢,它的整个格式呢,是这样子的,叫做肉。
36:02
哎,后边呢,你是一个叫异常类的。对,对象。啊是在方法内部啊这样的去使用,那下边呢叫Rose是吧,它呢是使用在方法的。声明处。哎,它呢,使用的结构叫做哎,Rose。对,后边那叫异常累是吧。这个异常类的话,你可能好几个。啊,异常类二啊,点点点根据你的实际问题就行了啊,这个呢是它的一个型,就是使用上呢,你看是怎么用的,一个内部一个声明,哎格式不一样,但是这呢不是主要的啊关键的话呢,你得把这个第二个问题说清楚。他呢,就是叫什么角色不同是吧。角色或者叫作用不同。这块的话呢,诶,我不是说了一个那个词是吧,大家应该还记得了,就是说叫上游排污是吧。
37:00
下游至午。哎,就这样个场景,或者呢,再换句话说呢,这个我们就说呢,咱们讲的叫抓抛模型,一个呢叫抛先。那一个呢,叫抓是吧。OK啊行这呢,就整个我们这异常处理的两个过程了,过程一这个我们叫抛,抛的话呢,这里边说分成两种情况,一个叫自动抛,一个叫手动抛,其实咱们所谓的那个自动抛啊。只不过不是咱们自己写的代码而已了,你要翻这个源码的时候呢,其实它最后呢,也会出现死肉这个关键字是吧。所以说呢,这个抛呢,用的其实就是死肉嘛。然后这个过程二。咱们呢叫做抓,这个抓呢,其实从呃准确度上来讲呢,其实想说的是那个catch是吧。哎,那换句话说呢,就是我们这个try catch这种方式来处理的事了,那除了这种方式之外呢,我们不说还有一种叫做Rose嘛,是吧,所以呢,我们把它呢,也看作是一种处理方式吧,所以呢,它体现的是处理这个呢,体现的是出现异常对象。
38:05
哎,所以它是排污的,这个污是就是对象的意思,排就是我们说的这个肉,哎置物质你可以理解成就是处理,哎,除了它之外呢,说还有一种叫Rose质,可以理解成就是Rose啊。这个呢,你要说出来的话呢,其实这个高度就拉上去了啊。好,这就过了。说呢,子类重写父类抛出异常的方法,能否抛出比父类更高级别的异常类?对,不能啊。这个你只能是跟他一样,或者是它的子类是吧,说过了啊,说如何自定义个异常,对了啊。哎,这个咱们都已经讲过了,就这三步呗。嗯,就行了啊。好对,你就抄一下这个exception,看他咋做的,咱就怎么做就行啊。啊,真呢,就是整个咱们的复习和企业真题啊。
我来说两句