00:00
那么常见这些异常啊,咱们就说清楚了,哎,我们熟悉这些异常的目的啊,并不是仅仅为了熟悉这些异常,哎,更主要呢,我们实际上呢,就要看一下该如何呢去处理这些异常,所以下边的话呢,我们就开始来讲下一个内容,关于异常处理啊,这呢也是我们这一章的重点,那这个异常处理这个异常呢,针对的就是咱们刚才提到的exception。啊,因为这个exception是吧,因为针对这个error的话呢,我们说呢,就不编写针对性的代码进行处理了啊,所以针对的都是它好,那么该如何去处理异常呢?这块我们从长计议啊,看一下我们这课件。所以呢,我们在这个编写代码的时候啊,经常呢,需要在可能出现错误的地方加上一些检测的代码,比如说X除以Y的时候呢,我们要检测一下分母是不是为零,就数据啊你是不是为空的,呃,输入的数据啊,是不是数字啊,而不是一些字符等等,如果要这样来做运算的话呢,这一个啊操作下去呢,我们就要加很多的E这样的一些分支了。那这种分支呢,过多了就会导致整个我们这个程序的代码呢,比较长,比较臃肿,可读性呢会很差。
01:06
啊,成员呢,需要花费很大的精力呢,去堵这些所谓的漏洞,这呢我们还仅仅是一个除法,那你要是判断这个控制人的问题。那更麻烦了,整个我们在程序当中呢,叫面向对象编程啊,全是对象,那对象上去调方法,那只要是一个对象,它就有可能是空,那每次呢,在调这个方法之前呢,都判断一下是不是空,那这个也太复杂了,整个呢这个体验就很差了,怎么办呢?诶这块我们采用这个异常处理机制呢,是这样子的啊。所以呢,我们把呃,可能会出现异常的这种代码呢,集中在一起。与这个明确没有出现异常代码给它分开,然后呢,集中式的我们进行一个统一的处理,这种方式呢,就使得我们整个程序的呃结构呢,就比较简洁优雅啊,可读性呢也比较高啊,也利于维护。啊,这个一说的话呢,还是比较抽象的哈,那具体该怎么写呢?那我们就看下边这种处理的方式了啊,我们就给大家做演示啊,那么整个异常处理的方式呢,我们说呢,有两种啊,第一种呢,叫做trackage的方式,第二种呢叫做ROS的方式,像刚才呢,我们在讲这个代码的时候。
02:09
哎,讲这个代码的时候呢,咱们就稍微的给大家演示了一下,使用这种肉的方式进行的处理,OK啊,那么这两种方式呢,有什么区别呢?诶我们可以呢,以一个故事呢,给大家呢去做一个讲解啊,这个故事呢,大家多少应该都听过是吧。啊,这个叫狼来了的这个故事啊,这个咱们现在都在听过这个,呃,下一辈的话呢,其实我有点担心呢,好像就不一定能听过了。啊,这个这个一扯有点远了啊,扯两句啊,这个你看我家这孩子现在是四岁啊,这个三岁的时候呢,就给大家报一些这个三岁两岁两岁那块就开始给他报一个课外的一个班了啊这个因为两岁多的还上不了这个幼儿园,然后那个班的时候呢,就一顿宣传啊,说我们这个都是来自纯这个西方的,呃,这个欧洲的这个教育啊,多么正统,其实我在不太希望他是这样的是吧。哎,包括呢,过很多的节啊,感恩节呀,这个这个万圣节呀等等好多的节,就没见过一个中国的节日哈,包括呢,这个一些活动的这些主人公啊,老师也是一个叫托尼的,倒没有是吧?啊,这个汤姆啊,那个莉莉呀,是吧?哎,都是这些名,你发现呢,中国传统的,比如嫦娥是什么呀,是吧?
03:17
呃,这个中秋节是怎么着呀?发现很多节日都不过哈,呃,纯西化的,有时候呢,想想是不是说一些阴谋之类的是吧?你想想的有点多了哈。对,诶,所以呢,导致就很多呢,小时候我们听到的一些故事,可能就是来自于父母了,诶我们这时候呢,很多呢,可能大家也记不住的啊,再往下边的话呢,其实都得是通过学校的教授才行啊,那得需要呢。还是学一些中国传统的一些节日啊,文化呀,在里边才可以啊,不能光学这个国外的了啊。好,那么这个故事呢,咱们拉回来说一下啊,这个这个故事本身的话呢,就是大家要诚实是吧,别说谎啊。结果发现呢,其实大人呢,没少说话啊。适当的舒缓其实也挺好是吧?善意的谎言啊好,这个故事呢,这个大家都清楚了,我们把这个故事呢,稍微的给他,诶处理一下,符合一下我们这样的一个场景。
04:05
说呢这个嗯,小孩呢在这放羊,这个羊呢正常在这吃草,他呢在这盯着相安无事,我们就可以理解成呢,这个程序呢,就是正常的去运行的啊,没有任何问题,然后突然呢,这块跳出来一个狼。啊,狼看着这个小孩,小孩看着这个狼。这时候呢,就出现异常了,这个狼就是异常。那这时候呢,该怎么办呢?啊,小孩呢,一看这个狼呢,比较嫩,第一次出来是吧。啊,那这时候呢,他自己呢一看,诶,他自己呢,就可以把这个狼给搞定了。呃,他呢,直接呢,就拿着这个,比如锤头,把这个狼呢就给打死了是吧,打死以后呢,这个羊呢,就正常该吃草还吃草。啊,那么这种方式呢,就类似于第一种方式。哎,直接呢,他就把这个异常给处理掉了。然后呢,接下来该执行还执行。哎,那么第二种方式呢?这个狼咔一出来一看,这是个老司机是吧?啊,比较凶悍啊,小孩呢,搞不定,这时候呢,他就得喊人了哈。他就喊说狼来了,狼来了啊,这时候呢,就诶这个山下的一个,呃,小伙就上来了是吧,小伙一看这个狼啊,相当于呢,这个小孩呢,这个喊的过程呢,相当于他就把这个异常呢给抛给了他的调用者了。
05:12
他如果是个方法的话呢,就抛给谁掉了一个方法的那个结构了,就是另外一个方法啊,然后这个方法这块呢,看到这个狼,就好比这个人看到这个狼一样,他一看说呀。我也搞不定是吧,诶,他就接着再喊人,就相当于又抛给他的这个调用者。他的调者一过来一看,说,诶,这个我能搞定他呢,把这个狼给打死了。啊,那么对于这个小孩咱们叫A啊,这个第一个人呢,叫BA和B的话呢,相当于采用的是这种方式。就是往上抛出的方式,就相当于喊人啊,然后对于这个C这个人,或者说这个方法来讲呢,他呢,把这个异常给搞定了,把这个狼给打死了,相当于C呢,采用的是第一种方式。好,这呢就是我们讲的这样的两种场景啊,那么从本质上来讲,要想把这个异常呢给它干掉。其实应该得像C一样,是把这个狼给打死是吧?
06:01
但是呢,作为过程出现的A和B的话呢,你说A对于这个小孩来讲,说你处理这个异常了吗。这个就看怎么讲了是吧,诶就是这个狼呢没死是吧,这倒是没死,但是你说处理嘛,其实也可以理解成处理了,就是我往上抛出了是吧,诶我让上一级呢去处理,牛人处理吗?处理了我往上抛了呀。是吧,诶对于这个B来讲的话呢,是我我也抛了呀,我网上成立了是吧,这个问题我搞不定,诶所以你处理嘛,处理了处理方案就是往上成立。哎,所以呢,这也算是一种处理方案,所以呢,哎,总共就两种方式。好,那这块呢,我们首先呢来看第一种,也就是我们所谓的真正意义上把这个异常给他干掉了,把这个狼给打死了啊好,那么我们就回到这个代码层面,诶我们来看一下这个艾特硅谷零二了,这个呢就关掉了。好异常处理的第一种方式,然后把这个第一种方式呢,咱们给它起了个名呢,叫做抓抛模型。啊,对应的呢,就是我们这个叫try catch finally。哎,就它了啊好,首先的话呢,我们提到了这样的一种处理方案的话呢,它有两个过程,抓抛模型,抓模型抓住你所抛出来的,所以第一个过程呢是抛。
07:08
哎,抛怎么来理解。哎,我们这常说啊,说呢程序。哎,在执行的过程当中。哎,过程。当中啊啊,一旦出现异常。哎,就会在啊出现异常的代码处。啊,异常的这个代码处。相当于呢,生成对应啊异常类的对象,并将此对象抛出。诶,你看这块呢,出现一个这样的一个情况啊,第一个呢,就是你在哪一行代码出现了,就在这个出现的这个位置呢,我们创建了一个异常类的对象,有同学说这个对象是自己创建的吗?诶其实呢,目前呢,都不是自己创建的啊,以后呢,我们还会讲如何自定义啊,咱们先说呢,诶它自动抛出这个事儿,它自动的创建了异常的对象,并将此对象抛出。
08:01
然后一旦抛出呢,这个程序呢,就不继续执行了啊。啊,一旦抛出啊,此程序啊就不啊执行。其后的代码了。啊,就是你这个异常呢,假设我们这个代码一行两行,三行四行,在第二行呢,出现了这块,我就抛出异常对象了,然后呢,三四行这个代码就不走了。哎,注意好,哎抛出呢,就相当于是产生了这个异常的对象,好比呢,这个狼呢就出现了,然后下边这个呢,我们叫抓,这个抓呢,我们换一个词呢,叫做捕获。啊说呢,诶针对于叫过程一中抛出的啊异常对象进行补货处理。哎,那么此哎捕获处理的过程就成为抓。哎,就称为啊,这个我们叫做抓。啊OK啊,那么一旦呢,我们将这个异常呢给处理掉了啊,那么我们这个程序呢,就可以继续向下执行了啊。
09:04
啊一旦将啊异常进行了处理。啊,那么代码呢就可以啊,继续执行。这边呢,可能同学有点迷糊啊,说这块不执行了,这块又可以继续执行了,呃,这个代码呢,指的是不是同一块代码,这个咱们,呃,基于这个结构呢,来给大家来去讲,到底是哪块不能执行,哪块能执行啊。好,那么这个说完以后的话呢,下边我们就来看一看这个track family的一个整体的结构了啊,这个整体结构的话呢,诶,其实这块我们课件里边也有,就在这儿写的,不妨呢,这块我就直接拿过来啊,咱们就直接呢说一下啊。好,首先呢是有一个踹,这个踹后边的话呢,是有一个大括号,这个大括号里边包裹的就是可能产生异常的代码。啊,可能有多横啊,哎,那么如果我们这个代码在执行的过程当中,如果没出现,没出现是我们希望看到的啊,那就不会呢,去选择下边的这些finally的代码执行。
10:02
嗯,Catch的代码执行说错了啊,翻这块呢,咱们先不管它啊,然后呢,如果说你在TRY执行这个代码的过程当中出现异常对象了,那么就会执行我们第一个过程叫抛。诶,也就是说在这一块这个代码当中,假设呢,我们是由四行代码,在第二行代码出现了异常,那么第二行这块呢,就会抛出一个对象三四行的代码,注意就不执行了。然后呢,一抛出来以后呢,我们接下来要补货了,补货的时候呢,针对于你这个对象的类型,依次匹配下面的多个catch。跟第一个呢,类型匹配一下,相当于呢,就是我们前面不也讲过instance of。说你这个对象是吧,是否这个类型。哎,如果呢是,那我就进去,不是不是就接着往下开始。哎,这块呢,正常来讲我们会有一个呢匹配上。匹配假设呢,跟第一个就匹配上了哈,然后这个cash里边呢,就是我们异常处理的代码,也是我们抓住它以后呢,进行补货处理里边的你想怎么做是吧,这样的一个具体的操作了,那一旦呢,我们处理好以后呢,下边这个cash呢,注意就不执行了。
11:11
不会说一个一个进去的啊就不执行了,所以呢,我们就只选了一个啊执行执行完以后的话呢,诶我们说呢,就继续往下执行,如果没有这个finally的话呢,如果这块还有一些代码,这块代码注意是可以执行的。也就我们说的,一旦将异常处理了,代码就继续执行,指的是这儿啊,那么前边的这块呢,我们说的四行代码,第二行执行了三四行注意就没有机会执行。呃,因为呢,你已经过掉它了是吧,他只能说呢,接着往后看。啊,这样的情况啊,好,那么刚才这块呢,我写的不是一个点点点,而是一个finally,它呢属于我们在拆开里边呢,可以使用的另外的一个结构,这个结构里边放的代码呢,比较特别,就是不管你前面有什么情况,这里边儿的代码是一定要执行的了。啊,那关于它的话呢,咱们可以稍微的靠后一点,专门来讲它啊讲我这块专门写个五去讲它,那么前面这块呢,咱们暂且呢,先忽略掉这个finally。
12:07
好,那下边呢,我们来看一看,针对于前面讲的这个try cash的这个细节是什么样子的啊啊,这里边儿我们就来写一些具体的笔记了,首先第一个哎,我们将可能。哎,出现啊异常的代码。哎,声明在咱们这个TRY语句中。哎,这样就可以了啊,那么接着描述啊说呢,一旦啊出现啊一旦代码是吧,哎,出现异常。哎,就会。这个单要自动吧,哎,生成。一个啊,异常类的对象。或者叫对应异常类的对象。啊,比如说你是个控制针,那我这块呢,就创建了一个控制针这个类的一个对象,然后呢,并哎将此对象哎抛出。哎,抛出呢,我们接下来就可以通过这个开去这个。
13:00
补货了啊,哎,那么抛出的。或者叫针对于啊,这个踹中。哎,抛出的异常类的对象,哎,然后呢,呃,使用。嗯,这个之后的。啊,这个开始语句。诶,进行匹配。哎,一旦匹配上。哎,就。进入啊这个。哎,进入我们这个catch语句块呢进行处理啊。来进行处理啊,说一旦处理结束。啊,这个代码呢,就可继续向下执行啊。诶这呢,就是整个我们这样一个过程,好,那基于这个过程的话,我们稍微的来感受一下啊,比如说针对于我们前面呢,写的很多的这个异常的这个场景,我们就可以呢去做这个处理了啊这个呢,咱们比如说随便呢挑两是吧。比如我们就拿它吧,啊,CTRLC一下。
14:01
啊,回过来啊,这个我们整个呢,把它这样粘过来吧,CTRLC。哎,站到这啊,这个我们就写成一了。呃,针对这里边的代码呢,我们就考虑去处理啊,你不是说会出现相关的异常吗?诶咱们现在就给它包起来了,嗯,这个从哪开始包呢。哎,可能出现异常,你也可以都保持起来。啊,这块我们就这样了,我就来一个踹呗。哎,一个大括号这样,然后呢,把这几行呢,选中我们就out shift上这就过去了,然后呢,Tab一下,哎,就靠后了,好,然后这块我们就把它包起来了,包起来以后呢,说可能出现了异常,那这块你看我来一个catch哈,K这块呢,咱们也知道了,叫input missma exception是吧。好,我CTRLC一下啊,我就把它粘到这儿了。来给我写个一。啊,Input mismatch exception没问题,好,针对这个异常的话呢,下面我们就进行处理,处理的话呢,咱们先简单一点啊,我觉得这块呢,先写一句话说,那叫哎,出现了。啊,Match exception的异常。哎,我就是这样一下,那这样写一下啊,说这块我们就先写一个梳理句,说呢异常处理结束。
15:06
啊,代码继续执行。哎,我就先这么着一下。好这块呢,你看我们去做一个执行。嗯,过来了,现在需要我们去输入一个值,假设呢,我这边呢,就写的是一个数值一个十。那就意味着我们这个程序呢,其实就会在这输出这个十。然后这个catch就进不去了。哎,他就直接呢,就把这句话呢,在执行了来。回车啊。这个能理解吧。哎,这个这个cash呢,是没进去的啊。好,那么我们再去把它抛起来。此时的话呢,我写个ABC,那这时候呢,就在这个位置呢,就出现了一个match,它自动的会创建这个类型的一个对象了,这个对象一抛出,我在这就补了一看,匹配了,匹配以后的话呢,就把这句话打印了。打印完以后,这句话呢,是不是也会执行出来?但是这个呢,值已经打不出来了啊。本身输入的你也不是个数嘛,是吧,所以这句话是没机会执行的,哎,看回车。
16:02
这不就我们刚才说的这个场景吗?开始执行了啊,这个呢执行了。那就是这样的一个过程啊好,然后呢,这块呢,如果我们要是写多个catch的话呢,那比如说再写一个,首先呢,你不能写一样的了。这块我们比如说整一个别的。比如说整一个叫啊叫IO的exception。哎,这个呢,我们。嗯,IO的Excel啊,他这块其实想说的意思就是你这也没出现是吧。换一个吧。这个我们后边再说这个细节啊,来一个控制人异常。哎,这样啊,好,这是一个控制的,然后再来一个。嗯,再来一个,谁呢?你看我写一个叫runtime exception。这个我们就出现了叫空指针的啊。异常,这个呢,要出现了运行时异常。这里边儿呢,我想说明一个什么问题啊。呃,我们在这个代码当中呢,说诶可能会有这异常,可能会有这异常,那如果呢,这个呢没进去。
17:06
啊,他就会匹配这个,这个也没进去呢,就会匹配这个。那都没进去呢,那如果说你出来一个没有能开得住的,那不就该报一场还报了。相当于你跟没处理一样啊。那么在这个里边呢,这两个呢,它俩是两个并列的类。就是没有这种继承关系哈,呃,此时的话呢,我把第二个和第一个呢,我颠倒一下。其实是没事儿的。啊,但是这个第三个的话呢,明显属于上面这两个类的。负累。啊,那要是负类的情况下呢,哎,注意我们要把这个负类呢写到下边。就跟我们前面讲if else一样啊,诶范围小的在上面,范围大的在下边儿,诶如果你要写上面的话呢,那。上来是不是直接匹配他了,下边这俩没机会执行了。但是这个的话呢,如果我就这样做了,它其实呢,编译就报错了。不像我们呢,你把范围大的写上面也不报错啊,它这个呢,直接就检测出来,你后边这两个呢,根本就没机会执行。
18:03
是吧,说已经被处理掉了是吧。被开始掉了啊,哎,这块呢,大家要注意一下。要放在这儿。呃,这一个细节,另外的话呢,你看我这里边呢,都是类型,这个呢,写了个E呢,就是这个类型的这个变量名了啊,因为上边呢,我们抛出来这个异常对象,它其实没有名。没有名呢,相当于我就把它呢,附给一个啊一个名了哈,叫E了,你可以在这里边去使用这个E,哎,这叫E,这是不是也可以叫E。因为呢,你有效范围就是这个大括号是吧,哎,所以呢,都还可以用它,OK行,那通过这个呢,我们呃,想说的一个点啊。啊,这块儿说呢,诶,如果声明了多个,哎,Catch结构。这个呃,不同的异常类型啊,在不存在啊子父类。关系的情况下。啊,这个呢,谁声明在上面。呃,谁生命在下面?
19:01
哎,都可以是吧。那么如果呢?哎,多个异常类型啊,多个异常类型,这个满足子符类的关系。哎,则必须将子类。啊,声明在。副类结构的。下,哎,上面是吧。哎,否则。发错。哎,这个呢,注意一下这个场景啊。好,这就是我们说的这个问题了,然后接着诶,我们这个catch里边呢,说叫异常的处理了,那平时我们异常都怎么去处理呢。哎,这个呢,写一下啊,叫异常处理的这个。哎,这样说吧,开始中。哎异常哎处理的这种哎方式啊,哎这个常见的话呢,就是诶方式一的话呢,我们就直接呢,哎自己呢,来编写输出的语句,哎提示一下说你出现什么样的异常了。像我们刚才这样一样,那这个程序呢,明明我们执行的时候呢,出现这个问题了,然后这块呢,写个ABC是吧,啊一回车明明出现问题了,但是大家其实刚才也看到有一个绿色的线,这呢也是个绿色的勾,其实呢,就相当于这个程序呢,他认为是正常结束的。
20:11
因为呢,你把这个异常都给处理掉了。哎,那我们咋处理呢?就是写了一句话啊,提示我们说出现什么问题了。哎,就是这个意思啊,那除了这个情况之外呢,有没有什么其他的方式呢?哎,这个有这个话呢,就提到了,我们在这个死rob这里边儿。啊,他是吧,这个RO里边呢,它提供了两个方法啊,回过来给我们看一下,课件的话呢,在这有写一个呢叫print sta trace打印异常的详细信息,一个呢叫get message返回值呢是一个独创。啊,那你得自己输出这个字符串,这就叫获取异常的原因。那那主要呢,我们处理异常的话呢,就给出来这样的两种方案啊,诶我这会儿呢,把它相应的这个粘一下。啊,回到我们这个位置啊。哎,这个呢,算是其中的一种方式。
21:01
嗯,还有一种。就是这个啊。嗯。哎,这个是方式三。就可以了,好这呢我们就提到了这样的三种方式,那平时我们开发当中用的比较多的是哪一种呢?哎,是第二种,哎,所以这呢是我们的一个推荐。OK啊行,那稍微的我们这块来演示一下啊,哎,那这个演示的话呢,我们不妨呢,可以再换一个这个代码吧,哎,回到我们这个测试这里边,随便我们再挑一个啊,比如说就它吧。CTRLC。诶,过来。针对他啊。这个上边我们也没保留,这个我们也把它也去了吧。啊,这个我们叫一个二啊。好,那么这块的话呢,我们针对这个代码,嗯,假设都到这儿吧,诶我们都给它包起来。哎,我们加一个TRY。再大括号。啊,这段代码呢,我们给它放进来啊,这呢我们写对应的这个开始啊这呢我们说可能会出现呢,叫number for me的exception,啊这个我们叫E了,好在这里边的话呢,我们就可以呢叫e.print stares。
22:08
哎,就这样一个方式,哎后边呢,你也可以呢,这块写个数语句啊,说程序结束。哎,这样就行。OK,这块呢,你看我们做一个执行。啊,执行完了。诶,大家说呢,执行了吗?我执行了啊。嗯。这个怎么叫执行了嘛,就是说可能会担心这这怎么跟没处理一样呢。嗯,就是我们这个操作呀,其实就想让他输出的是这个东西。啊,所以呢,哎,我们后边这个程序结束呢,它也是正常结束的,而且咱们不是也给处理掉了嘛,所以你看这个都是绿钩。哎,都是没问题的啊,哎,这个呢,就是我们说打印这个,诶堆栈信息啊,把你相应的哪个方法里边又调哪个了啊,相应的这个情况呢,都给我们罗列出来了。大家似乎感觉说。跟没处理好像一样是吧。你看哈这个呢,显示的这个信息,你看我这块盯一下跟回到我们这个位置。
23:05
啊,这不我们调的也是他吗?这个你去run一下。是不一样。哎,那这样可能就担心,那我那处理有啥意义呢。似乎有这样的一个担心是吧,好,那这个呢,其实结论是什么呀,结论呢就是说首先啊,你这个位置呢,是没过。表示出现异常。你没处理。啊,程序出问题了是吧,我这个呢,我处理了其实。啊,这个呢,你看有个区别,我们这块刚才是这个绿狗啊,这是一个点,呃,另外一个点的话呢,就是说呃,我这个呢,对运行时异常啊,其实呢,咱们真正在开发当中啊。其实像这种异常呢,咱们就可以考虑不去处理了。你说为啥呢?因为你处理完以后的话呢,我们常用这种方式。然后处理完以后呢,你看打印的信息跟我们直接报出来信息呢,其实一样啊。但是说有同学说有区别啊,这个你这块呢就执行了。
24:00
呃,你想你这个代码本身也都错了,我们处理的话呢,也只是说让他呢接着往后走,你本身这个事儿呢,其实还是没成。也就是说呢,我们这个处理呢,其实是预防,诶你要万一出问题的话,按照指定的方式呢去执行,我们能看一下信息,但是归根结底呢,你这个代码还是有问题的吧。诶所以说呢,诶怎么着呢,对于这种运行时异常,其实我们平时呢就不处理了。啊,你就正常让他跑,跑错了以后。比如这个程序,我们刚才运行跑错了,下一步你要干嘛?下一步不是要写一个拆开吧。是吧,出现异常了是吧。那肯定不行哈,对,所以你下步要做的事还是改代码,最终目的还是代码有问题是吧?诶我们家拆开的目的呢,是提前预知,万一要有问题呢,先提前给一种方案,这个一说有点有点绕啊,什么意思,你看这个啊。啊,你比如说呢,咱们这是一个客户端了,这个客户端呢,你写了个代码啦,然后用户呢,去使用可能会有一些极端情况,这个极端情况的话呢,有可能用户呢,比如这个按钮我一点。
25:03
出异常了。可能是网络拥堵了,也可能是这时候,比如双11大家都在支付,同时支付的人太多了,这个呢,后台也没有扣款成功,那你如果要是一个没有处理的异常的话呢,整个呢,给用户呢,假设呢,就抛出一堆这个异常信息,在用户看来呢,这就叫乱码是吧。他就崩溃了,这是啥烂程序是吧?转头就给你卸了。哎,那这时候呢,就说不太好,哎,那这时候我们怎么办呢?咱们加一个try catch是吧。来给大家做个处理,然后呢,当他这块一支付的时候呢,哎,突然呢,就出现一个画面,这个小孩呢,坐着哭呢是吧。啊说呢不好意思是吧,出错了,你看还感觉挺可怜的是吧,人说哎,算了吧,我们再退回一下,重新再支付一遍得了,诶这个呢,你可以理解成就是他把这个异常呢,给你一个友好的方式给呈现出来了。但是呢,归根到底呢,还是代码有问题是吧。啊,你得让这个代码呢建容器会更好,所以呢,通常在出现异常的时候呢,它会发送一个日志信息发送给后台了,后台呢就记录了,后台呢他再回头呢,整理一下日志,看看出现什么问题了,然后他再把这个代码呢,再这个修改一下,是他的健壮性会更好,避免以后再出现问题是吧。
26:14
啊,应该是这样一个逻辑,也就是我们这时候呢开呢,是对一些临时状况呢,出现问题以后呢,呃,有一个提示了啊,让程序呢,也不至于崩溃啊,直接的这个系统就这个程程序挂掉了,不至于这样,而是呢,用户呢还可以呢,友好的去退出啊退回这个界面,然后我再重新进入一下。这个体验的又很好,这个应用程序呢,还是正常运行的,只是这个功能请求没有实现而已啊。诶,那么最终到最终的目的呢,还是要改这个代码,OK,那我刚才说的这个场景呢,其实针对的是属于我们编译式的异常的啊。对于这种运行时异常的话呢,因为我们要呃处处去加拆开吃啊,可能出现的场景也是太多了,没必要。啊,只要出现了回来改代码就行啊。好,这块呢,大家需要去体会一下,也是我们这章的一个难点了啊。
27:02
嗯,接着呢,我们再说一个小的点啊,这呢是我们说的这个处理的方案啊,Get message呢也能用啊,我们把这个先体会一下。在这个位置呢,我们就直接呢1.getmessage,注意它呢不会自动的去显示打印信息了,它就是个字符串,需要你自己呢去输出一下。Run一下。哎,出来一个这个说呢,For input string啊说你因为写了一个ABC,什么原因呢,你写的ABC。哎,不满足我这个要求啊,出现的。这是它,哎这两个相比较来讲呢,我们使用这种方式呢,要多一些啊。哎,这个大家稍微注意一下,咱就不自己呢去写输出语句了。OK,然后另外的话呢,我们再体会一下啊,但是你看我在这个位置啊,我还能不能去打印一下我们的str。你看是不是不行啊。哎,那这个怎么理解呢。呃,也就是说呢,我们在这个踹当中声明的这个变量啊,它的作用域呢,只在踹里边。
28:04
出了踹呢,就看不到了。后续呢,我们在一些编程当中可能会遇到这样的这个场景啊,啊这块回不来,哎,在这做一个说明啊。哎,这个呢,就是哎TRY中哎声明的这个变量,诶除了。哎,踹结构之后。之后啊,就不可以进行调用。乐是吧,那这个呢,就从这个作用玉的角度呢,去解释就可以了啊。好,那么通过刚才这样一个演示呢,刚才我说了一个重要的问题,就是关于运行式异常啊,诶这个呢,咱们发现了我没有用track开去处理,跟我使用track开处理呢,发现了也没什么区别,诶所以呢,我们在实际开发当中,咱们针对运行实际常呢,就不专门去处理了。啊,对于应用是异常开发中。哎,通常。哎,就不进行。哎,显示的。哎,处理了。
29:00
哎,那你就直接呢,让他正常执行就完了,诶如果出现运营时异常了,那你就回过来根据它提示的信息去改代码就可以了。啊,那么一旦在程序执行中。出现了。啊,这个运行时异常。哎,那么就。呃,那么就哎根据啊这个异常的提示信息。诶,修改代码即可。OK啊,这个呢,就是我们相应的这种解决的这种方案啊,好,注意这块我说的是运行式异常,那要是编译式异常呢,我们就必须要处理了,所以我们层层递进啊,拆开始翻离主力来,主要来处理的就是编译式异常,好下边我们举一个编译式异常。啊异常,诶往下走这个呢,不妨我们就拿它来说CTRLC。哎,回到我们这个位置啊。哎,这块我们打一条线啊。
30:02
哎,下面来处理编译时。一场。OK,这呢往那一粘啊,诶把这个代码呢,我们打开它。哎,就这样了啊,这呢,我们叫一个三。好,目前呢,我们看到这里边儿呢,会有这个异常信息,咱们这个上节课呢,给大家演示的时候呢,也看到了,其实这个文件是存在的。啊,他也不会出现他但是呢,这时候呢,编译就不让我们过,说呢,你就得提前告诉我,万一要不在怎么办呢,说白了就是你不处理都不行。那处理吧,处理这块呢,我们就得是这块写一个踹是吧。这么着了,然后呢,把整个的这个代码呢,CTRLX啊,我把它粘过去。哎,针对呢,可能出现的异常,我们在这儿写这个catch尺。这个开始呢,第一个叫not found exception。诶,CTRLC啊,过来这写一个E。哎,这呢,我们就1.printsta死,这不是常用的,就是这样处理吗?好,再接着开一下,下边呢,这几个都是IO exception。
31:03
哎,我呢就往这一放,哎这呢也叫E。1.print,这就可以了。好,然后呢,这个file not found exception,我CTRLH。看它的一个继承关系啊,你会发现呢,这个file not found exception,它也是继承I exception的,所以他俩有子父类的关系。诶这呢不是集成于runtime exception,所以呢,这都是叫编译式异常了啊,这个它俩要子互关系的话呢,就意味着这俩呢,你不能够。颠倒是吧?哎,电脑就出错了啊。哎,这个要注意一下。呃,那再说一句哈,我这儿呢,写的比较细。啊,俩都写出来了,但是你发现呢,我这儿呢,处理方案是不是一样啊。你说这种情况下,其实我说要是把这个删了呢也行。理解吧。诶对哈,就是即使呢,你说实话的是一个首先呢也能补。其次的话呢,你要说哎,你这个子类这个是父类他俩的print方法的,呃,这个方法体不一样不一样,这块是不是也多肽了。
32:03
哎,对的啊,就是完全可以替换。那这块咱们刚开始写,咱就先留一下吧。先留一个啊,其实呢,是留一个就行啊。好,那这块呢,咱们就把这个代码呢,给它包起来了,这样呢编译就没事了,没事以后呢,我们现在呢,就想去做执行了,来我们做一个run。啊,大家看这个时候呢,把这个数据呢,就给它打印出来了,这呢就是我们在这块写的啊。哎,打印的这个信息。哎,这块我们再补一句话吧,在这儿啊。说呢这个诶读取数据结束。哎,这样的一个操作,我们再重新的再运行一下。这呢,把这个数据读完了,说读取数据结束。那么在整个这个过程当中啊,其实没有出现任何异常,也没有捕获过。那接下来我把这个位置改成叫哈伊。这个文件呢,显然就不存在了。那这个时候我们再去做一个执行。啊,大家看啊,那么这个时候的话呢,它执行这也是个绿条,因为呢,我们出现异常了,咱们给处理掉了啊。
33:05
出现异常的话呢,是在这个位置,它产生了一个叫not一个对象,这个对象呢,直接啊,从这一出现直接就到下边去了,后续的这些代码呢,都不执行了。直接就蹦到我们的这个位置了,跟他一匹配,这个呢叫print stares啊这呢就把这块的这个信息呢,就全打印了。这块这个情形看就都打印了。诶打印完以后的话呢,诶我们就不走下边这个开始了,接着呢,不就把后边这个输出语句给执行了吗。哎,就是这个过程来,咱们可以呢,给bug看一下啊。哎,我们在这点一下这个第八个。诶,这边这个代码呢,就在这儿,接着我们走下一行。这行目前还没执行的哈,我们再去啊这块你看cons这块都没有是吧,我再去一点,直接你看就进去了。这时候你看一下console。啊啊,这个他们也显示到这儿了。啊,这个还没啊对,还没有去print呢,是吧,再接着我们往下去行走,这个时候print就结束了。
34:04
是不是就出来了。哎,然后这块呢,我们再往下呢,再点一下是不是就到这儿了,我们再执行是不是这个语句就出来了。哎,跟我们刚才说这个过程呢,是一样的啊。好,这个呢,就是整个我们处理这个编译式异常的一个过程,编译式异常咱们说呢,必须要处理啊,因为你发现呢,你要不处理的话呢,根本就不让你去运行啊。所以回过来,哎,把这呢写一下。对于编译是异常,我们说呢是一定。啊,要进行处理,否则编译不通过。哎,这个呢,是我们说的这样一个场景了啊,那么接着大家再去理解一下啊。我们这个编异是异常呢,我们给他处理了,处理以后呢,该开始开始,这里边我们是这样写的。你会发现呢,诶它变异式异常虽然处理了,但是在运行的时候呢,是不是照样还可能会出现了。其实呢,我们可以理解成呢,就是咱们把一个编译式异常呢,呃,相当于给他延后到一个运行时出现了。
35:03
那就相当于是你真正出现了一个问题了,那就是在运行的时候呢,爆出来。是吧,哎,这个那就是出现了这个,大家做一个理解就行啊。啊,那平时我们操作的话,你就知道一看咱们写代码,比如说针对我们刚才那上面的这个例子。啊一起玩,直接在这报了一个红线,哎,这个你要看这看不出来,你就看这边了,诶这个红点往这一看说呢,你这有一个叫class not found exception没有处理行,像这呢,就编译是异常了,你就直接呢,可以选择拆开去处理,也可以使用我们啊后边要讲的一个Rose的方式去处理就完了。哎,怎么处理呢,一般呢,都是我们叫print sta的一个方式。哎,就行。诶,所以说呢,也算是比较简单一些哈,所以这块呢,大家重点关注的就是它一定要处理。好,那么这个呢,说完之后的话呢,诶,我们再说的话呢,就关于这个finally了啊,这个等咱们再来的时候呢,咱们再讲它啊OK。
我来说两句