00:00
那接下来呢,咱们就来说明一下这两种处理的方式呢,首先呢,来说的叫try catch finally的这个处理方式,这样呢,我们就写成个一啊,下边呢写一个二,叫try catch finally的处理。它的一个使用,首先呢,我们关心的就是这个结构呢,应该怎么去写,就像前面讲说这个Switch case一样,说这个for循环,Well循环一样,那个整个结构长什么样子,这呢我们先把这个结构呢给它声明出来,这呢是个踹,踹呢一对大括号,这个大括号呢,就咱们刚才说的,你可能会出现异常的那些代码,就可能会生病的这些人啊,就给他隔离起来了,用这大括号呢给它包起来,这个呢叫可能出现异常的代码。注意我这写的叫可能啊,就是不一定出现,就像咱们写了一个scanner,站着你获取一个int型的值,用户人家要是写的就是个123,这就没出现,他写的不是123,写的ABC就出现了,所以说这块呢是有可能出现的,不是说非得要出现,那么包起来以后,我们在后边呢,去写对应的catch,这呢就叫异常类型一,后边呢有一个这个变量名。
01:15
哎,变量名我这也写个一。行,然后呢,这块呢有一段大括号,那这里边干什么呢?这就相当于是处理异常的方式。去异常的这个方式一这样,那么有可能你不止这一个异常类型,我们是可以匹配多个异常类型的,就有点儿像咱们这个Switch,你可以写多个case一样。Switch你不是也可以写多个case吗?对这呢,咱们就相当于你可以写多个catch,就相当于呢,就是我这代码呢,可能出现问题,出现异常,你要出现的是这个异常类型,我就这样方式去处理,你要出现的这个异常呢,我就这种方式去处理,这个呢,我们就诶下一种。
02:04
方式去处理,那根据实际问题呢,你可以写多个,这个叫catch行,然后在最后的话呢,我们还可以再放一个叫做finally finally是一个关键字了,也它的意思呢,就是我们将一定会执行的代码呢放在这里边。一定会执行的代码,嗯,这块呢,大家可能理解还不太好,这个咱们这个讲到这儿的时候呢,就来说整体的话呢,就构成咱们track开翻的一个结构,那下面的话呢,我们就使用一下这个结构呢,来处理一下咱们出现的这些异常,以及呢,在这个处理过程当中,咱们说明呢,怎么去用好,下面呢,咱们就拿着前面咱们出现的这样的一些异常的情况呢去举例子。先打开包,这呢我们随便呢,从前面这里边拎出来一个就可以先拎一个这个咱们前面见到的这个叫这个运行时异常行,我这呢就拎了一个,那拎了一个以后呢,咱们一执行当然知道了,肯定出异常了,出现异常number form me exception这呢出现在咱们这一行,在这应该也有写43行,43行这块出了一个叫number form me,就意味着它是不是就是我们可能出现异常的代码,对,那这时候我要包的话呢,我就得把它呢给包起来了。
03:29
那这时候包的话呢,上面还有两行也不多,我要整个包住行不行,也可以也可以,就是不用说非得说我就只包一个,他就是你,你可以把这个都包住也行,也没事说我要不想包,不想包你就别包,那我这呢,比如说就想包他,那你就这样把这个这不就包起来了,包起来以后呢,这个的代码你说可能会出现异常,那可能出现异常,出现什么异常提前你都应该知道了,叫number form吗?Exception,那这块呢,我们就写一个catch,这个位置我就写个叫number form me。
04:05
的exception,那后边就写个变量名,习惯上咱们都该写个E了,Exception这个E行,那这里边呢,就是你处理异常的一个方式,如果出现这样的一个异常对象了,怎么办呢?这块暂时呢,咱们就先简单set out一下,说呢叫出现,出现这个叫类类型。Number form叫数值转换转换啊异常了说啊不要着急,哎这样暂时呢,我们先写一个输出语句,好,这个呢,完事以后你会发现,诶,目前这个程序没有报错,其实就意味着咱们这时候这个finally啊,不一定非得要写。就有点像Switch case default一样,对这呢,咱们先不说这个finally啊,所以我这专门先写下说这个finally它呢是一个可选的,前面也用过这个词了,就不一定非得要写,咱们暂时呢,大家先忽略掉这个finally,咱们先把上面这个说清楚,后面呢,专门我通过一个代码呢,咱们去说一下这个finally的问题啊,什么叫一定会执行的代码行暂时呢,先是可选的不管了,然后接下来呢,咱们看一下这个程序是怎么走的,那这块呢,我们也可以在这个位置呢,我再写一句话啊,这我写个hello这样子,然后呢,我在这个我写个hello杠一,CTRLC,我在这个位置上写个hello杠二,看看这里边这些输入语句哪些都会被执行,好这个跑一下先。
05:46
大家看我们这时候呢,确实出现异常了,但是呢,这个还是个绿条,就是因为呢,我们把这个异常呢给处理掉了。你认为ABC它应该是有问题的是吧,但是呢,他这个绿条就因为处理掉了,就跟说这个狼确实来了,狼也出现了,但是呢,把这个狼呢给打死了,打死以后呢,其实就就当没事一样,所以程序该走还走,所以呢我们看到这个输出结果。
06:12
输结果啊,这个hello杠一没有,咱们刚才也提过了,一旦呢,你在这块出现异常了,就会在这呢自动的会生成一个自呃对应异常类型的一个对象,其实就是这个类型的一个对象呗,这个对象呢,它就抛出来了,抛出来呢我这一踹呢,这个时候我下边这个就蹦到这个开始这块呢,去进行一个捕货,正好跟你这个类型匹配就进去了,所以呢,就输出这个cash始当中的这句话,那输入完以后呢,相当于你把这个异常对象呢就给处理掉了,那处理掉呢,因为我们这个程序呢,就正常的可以再往下走了,所以你会看到这个HELLO2,哎就这样,就相当于是你这块呢出去旅行了,然后突然到这儿呢生病了,生病以后的话呢,这个病毒就出现了,就相当这异常对象,然后这时候呢,你一吃药,哎这块呢,就哎这个这个这个操作就是吃药,哎吃完药以后呢,这块又可以活蹦乱跳了,哎又可以执行后边的代码,哎这样的一个过程,行这个呢。
07:12
你看我写的是这个叫他啊,但是你要写的不对的话,比如说啊,比如说我这写的不是number for me exception了,我写成个啥呢?写一个叫no point了。Except这个我写的,写的是一个控制异常,你说我这要执行的。是不是还是错的?这就相当于吃错药了吧?是吧,或者说应该准确的说,应该叫没吃药啊,就你这出现这个病以后呢,我就没进去。对吧,他其实没吃药啊,没进去就根本就没执行,所以呢,你这个看着是开的挺好,实际上没处理。对吧,没有处理,那你要是想这个这个处理,你还得加上这个叫哎,Number form me,哎这个exception,诶这诶我这还能叫E吗?可以对你这个E呢,是不是只在你这个开当中有效,对我这呢,还可以再写一个啊那这个呢,人家这个信息呢,就放在这了,跟你这个也不一样了啊这个上面这个我们就出现了叫控制帧异常。
08:28
出现控制异常了啊,不要着急啊等等行这呢就相当于我们并列呢,写了两个结构啊,那好了,咱们这个这个在这里边写相关的一些注释啊,首先呢,咱们提到呢,使用使用这个串啊,将将可能出现异常的代码呢,包装起来的代码啊,包装起来这个呢,就是用于就是大括号来表示的,那么在执行过程中啊,一旦出现异常。
09:04
一旦呢,出现异常,我们说呢,就会生成一个异常类的对象,生成一个对应异常类的对象,然后呢,这个根据此对象的类型,哎去我们开始中进行匹配,哎这呢这个事呢,这不就往下走到我们这个catch里了,那catchche这块的话呢,我们就得看一下这个你这个对象到底是哪个类型的,根据这个类型呢,我们进行这个匹配,这呢啊一旦这个踹中的嗯,异常对象,然后匹配到。匹配到啊,我们说某一个cash时,Cash时我们说呢,就进入这个cash中啊,进行异常的处理,进常处理,然后我们说呢,一旦呢,处理完成以后,一旦处理完成就相当于呢,你执行完你这个某一个catch了,这个布防呢,这个我们就说到这个事儿,我执行完这个catch,如果我下边还有catch还走不走,比如说你看我这再写一个啊,我这写一个的话呢,我就我我写一个大一点的吧,Exception这就直接要出现异常了啊,那我们就走不走了,你就看一下这个输出的结果当中,因为这时候咱们这个异常是不是也也满足他是吧?啊一秒看你看这这两个是不是都执行了。
10:35
你看是不是没有执行下边这个。哎,那就相当于说这个进入开始当中呢,进行异常的处理,那一旦呢,处理完成就相当于是跳出,跳出咱们这个当前的这个开结构。哎,Try catch这个结构,当然了,这个大家小心点,咱们当前这个前提呢,是没有写finally啊,在没有写啊finally的情况下,这个写finally啊,这就是我们一会再单独的去说啊,一旦呢,你这块呢,满足某一个开始的时候进入执行,执行完以后呢,直接就跳出这个结构了,跳出结构以后呢,这个后边的语句还能执行吧,就是拆开这后边了可以是吧?诶那么就跳出这个拆开结构,然后继续执行其后的这个代码,相当于咱们这时候把异常的你已经处理掉了,这个程序呢,是可以继续往后走的,跟原来不处理呢,确实还不太一样。
11:42
继续执行其后的这个代码行,这是我们说的这个问题了,然后呢,第四个问题,第四个问题呢,大家会看到我这呢可以写多个catchche,在多个catchche的话呢,像这个控指针和这个number form me,你说他俩有没有先后顺序啊。没有,咱们前面讲if else时,If else的时候呢,也提过说呢,你这个要是有一个包含关系的话呢,把范围小的写上边是吧,范围大的是不是写下边,对,那你像这里边呢,其实也类似啊,这个类和这个类它俩之间,你看API的话呢,你看我这CTRLT一下,它继承的是这个这个继承这个这样的一个T系结构,然后你看这个no po ctrl t。
12:27
哎,也能看到这里边,你会发现这个number form number number pointer跟我们这个number form,它俩是不是没有什么关系啊,相当于你是一个负类的两个不同的子类了,也就是说它俩没有这种继承上的关系,没有继承上的关系呢,就你可以列解为是两个互斥的一个范围,其实它俩呢,谁写上边,谁写下边,是不是无所谓啊。无所谓,那你看下边这个,我这个except呢,显然是一个负类了,CTRLTCTRLT的话呢,啊,这个还不太好找,咱们下边这个吧,那你看看这个吧,CTRLT它的上边的上边这不就是exception了,呃,这个number form me也同样的道理,就是说我们ex exception呢,是作为它俩的负类出现的,那你说我这个ex exception这个结构是不是它就不要往上放了,你要往上放是不是人家一进来是不是先就考虑它了呀?对的,那你看我要是放到上面呢,对,一放到上面呢,跟咱们说的那个E还不太一样啊,If house说你放上边呢,它不会报错,只是说你执行的时候,下边没机会执行了。
13:37
但是在咱们这块呢,下边报错了,说是一个unreachable的。不可到达的了,因为呢,你这块一上来要真出现这两个异常的话呢,直接就蹦到这个里边了。对下边就没机会了,所以这块呢,咱们把这个事儿呢,也说明一下,第四个点说cash中的这个异常类型啊,异常类型说如果没有子父类关系啊,则这个谁生命在上,谁生命在下无所谓。
14:12
声名在下无所谓,嗯,就是都可以,那么再换句话说呢,说开中的异常类型,说如果呢,哎满足此父类关系,哎你都满足此汇类关系,我们说则要求这个要求这个子类一定声明在这个父类的上面。上面啊,否则报错这块呢,这就报错了,这个很好理解是吧,这个就过了,然后再接着呢,我们提一下这个第五个点,那么开始当中呢,咱们目前呢,是我写的是这样的语句哈,说直接呢就out了一下了,嗯,那除了这种处理方式之外呢,还可以怎么去处理,这呢就涉及到这个catch这个大括号当中我们长期常调的两个方法了,这呢毕竟也是一个对象嘛,对象里边它的定义方法了,对,那这呢用的是什么操作呢?经常咱们用的是这样两种啊,第一个呢,涉及到一个方法叫做get message。
15:21
哎,这是一个操作,那这个方法呢,它返回的还是一个string,返回来是一个字符串了,那意味着你想看的话,你得自己输出一下,那我就写个一点get一个message就是这样了,咱这里边呢,确实出现了也是一个number form me了,那我们看看。OK,诶number for me,你看它的这个message,就是说你这个input啊,字符串这个ABC这块呢不合适,诶这呢,就是这个message处理的一种这个这个方式啊,那还有一种呢,就是我们经常调的叫print stack trace。那这个方法,然后这呢,不用这个你再去这个字符串去接收了,它是个word的方法了,所以我们直接呢,就1.print。
16:11
Sta这样写的,那么这些,呃,上面这个我就注意了,这样来处理。OK,你看爆了好多红,这个呢,是咱们自己让他print stas出现的,就是出来一个叫number for me exception,其实你也看到,就是咱们那个print stas里边其实包含了这个message,而且呢,会详细的看到整个我们这个程序在运行过程当中调的各个具体的结构啊,都到哪些结构,然后出现的问题了啊这呢就能看到,然后你这里边去找一下咱们这个代码是在哪出现的,咱们是在这个六十五行这出现的,诶不是在这出现的,这是你最终的一个异常是出现的一个位置的是吧?呃,在咱们这的话呢,咱们是出现在这个这59行这里边呢,你也是能够找到这个位置的。
17:05
Except在这了。嗯,咱不能是在这儿了,是你这掉的哈,是在这出现的吧,对吧,这不就能看到在我们这个51行出的这个异常啊,行这呢就咱们这个通常爱在这个catch的这个大括号当中,通常爱写的两类异常处理的这个方式啊这呢指明一下常用的呃,异常这个对象啊,处理的这个方式,这个方式呢,一种我们用了一个方法叫做来返回是一个string,叫get a message,这是一种啊相当于打印一个呃,获取了一个异常的一个信息啊,然后第二个呢,叫print,呃,Sta tras,哎这呢就是打印整个我们这个诶这个对战的一个信息了,这两个里边的话呢,这个咱们比较常用,哎,这个比较常用一些哈,就是后边呢,咱们就不用自己去写这个C的语句了,直接呢,你这块呢,去呃,调一下它就OK了,哎,这是比较常的一种情况,行,嗯,这呢说的这个第。
18:09
五个点,那基本上咱们这块呢,说的就差不多了啊,这个稍微小细节的话呢,就大家可以看下这个事儿,我在TRY里边是不是定义了一个number是吧?定那个number,这个number的话呢,你看我在这个位置能不能去调呢?报错了,这个不能能理解不,因为咱们是不是在这个踹的大括号里定义的呀,哎,出了大括号以后呢,就不能用了,这个后边呢,咱们会遇到这样的情况,哎会遇到这样情况,在这呢,我们也明确提一下,这是第六个点什么呢?就是在咱们这个踹结构中定义的,或者你要声明的啊,声明的这个变量,哎,然后在出了,在出了咱们这个串结构以后,就不能再被调用,哎,这要注意,那如果你要是外边确实需要用一下这个number,那怎么办?
19:09
有多中我就放外边,那你方便这个本身它有异常啊,有异常你不得放里边吗?怎么办?咱们是不是原来有过这样的经验,我把它声明到外边,里边呢,是不是用一下这样的话呢,你声明到外边,我这呢还可以用,然后呢,你有异常呢,我还给你放到里边复制,你还可以去处理。保存这时候呢,为什么还报错呢?是因为你在里边赋值的时候呢,他有可能担心呢,你万一要没附上,这是不是相当于没初始化啊,那你可以先给他一个值。这不就不搞错了吗?这种事情咱们后续呢,会有这样的经验,所以大家呢,提前呢,先知道这样一个事情好,那么这样的话呢,咱们把这个track开这个结构呢,基本上就都熟悉了一下,那使用这个track开结构,大家呢,你可以下来试试呢,把咱们前面讲的这些异常呢,你都可以给他去处理一下,都可以处理一下,尤其呢,是像咱们最上边这是不是有一个叫编译式异常啊。
20:11
对吧,这个异常的话呢,我们要不处理,是不是这块就非得打叉了,所以你看我这块我给注入掉了,那这个呢,就必须得给他去处理一下了。嗯,其实处理很简单,这样,我这样CTRLC拿过来,这基本这个点是不是咱们都讲到了,我把它粘过来,这个改成是一个二,这个呢,你一打开。一打开你看这是不是就先ctrl shift不O一下打包,这不是包错的地儿吗?包到地呢,它可能出现异常了,像这个编译是异常,直接就这边打叉了,咱们这样给它包一下。这不是你可能出现异常的代码嘛,那你得有开始啊,开始呢,咱们看到有好几种类型的啊,有这个叫file not found,对,然后found section,然后这写个E,在这里边呢,就1.printsection,然后呢,还有可能你看这我写完以后呢,这个就不报了,因为我在这块已经给它处理掉了,哎,剩下这三个呢,还报,剩下三个报的还都一样,L的ex except,一个E啊,1.print,诶这不就都搞定了,而且呢,我们这个file not found exception,我controlt t一下,你发现呢,它还是我们这个IO的一个子类,那就意味着这两个你不能颠倒,CTRLV,诶一颠倒这块它就报错了,哎,这个样子行,那么这样的话呢,咱们把这个编译是异场,这不就处理掉了,处理掉以后这是不打叉了,不打叉说明什么呀?编译是不是就能过了,那编。
21:48
这能过了,运行一定过吗?运行不一定过,你看我这个文件,我要是真没有,你是不是照样还是会爆啊,对吧?哎,所以说呢,大家通过这呢,你去体会一下一个问题,先写上体会,哎体会什么问题呢?咱们使用try catch啊先加上这个发点啊,它呢来处理叫运行时异常,嗯编译是异常处理这个编译时常这个使得使得我们这个程序在编译这个时就不再报错啊,但是呢,运行时仍可能报错,这个报错呢,就出异常的一个意思,在运行时呢,仍可能报错,相当于相当于呢,我们使用try catch finally的这个结构。
22:48
这个将一个哎将一个什么呀,编译时可能出现的异常呢,给它延迟到运行时出现了,延迟到运行时,哎这个出现可能出现的就是你要没有那就运行也没事,但是你要是运行的这个真要有一常编译时候呢,就就不报了,在运行的时候呢,才报运行时出现行这呢咱们就先说成这样。
我来说两句