00:00
好,这呢,咱们就把这个try catch finally属于我们第一种处理异常的方式,这个基本讲了讲,讲的话呢,其实我们也主要呢是提了叫try catch的一个处理,关于这个finally呢,现在我们还没有具体的去使用,那下边的话呢,我们专门写一个代码来体会一下这个finally,毕竟呢,我们TRY开finally当中还有这样一个结构,那我们就得考虑什么时候会用,以及呢,这里边提到一个说一定会执行的代码是什么意思啊,这个我们得关注一下,这呢我们去新建一个class,我就叫做finally的一个测试了,诶这呢是咱们这个叫嗯,异常的第一种处理方式叫try catch family中。诶,TRY开finally当中,我们这个的一个使用,好说一下它啊,那这个finally的话呢,刚才我们看到了说叫一定会执行的代码,我们把它放在finally当中,那对于咱们下边写的这个程序来讲呢,其实倒没有特意的说说哪个是必须要执行的代码了,所以我们就没有用finally,那其实呢,我们也看到了,相当于这个finally呢,是一个可选的,可选的好,那么我们这个说完以后呢,下边呢,咱就别让他可选了,直接呢就得写一个带family的了,你得体会这个family到底应该怎么去用,行在咱们这块呢,写一个代码,W个Y的台词一这样子啊这呢我就演示一个比较简单了,A呢是一个十,哎,B呢是一个零,我让这个里边这个A呢去除以B,好让这样去做一个除法,显然的话呢,我们这个代码呢,说会出现这个异常,会出现异常的话呢,我。
01:46
这给它加上一个TRY,不妨呢,我把这个AB呢就也给它包住了,这个呢就放进去,在这呢写这个catch,嗯,Catch的话呢,我们可以先写个叫ariatic exception,哎,这呢我写个E,哎里边呢,我们就习惯上呢都是print sta了,这样去处理,哎这个呢,因为就这一个异常,所以我就没写别的了啊,你要是说想补一个呢,补一个也可以,这个我们再去catch一个啊,Exception,比如说你看这里边我们也是1.print。
02:21
诶,Sta trace好这样的来写了,然后的话呢,我们在这个后边呢,说可以去加上一个叫finally finally的话呢,我们说叫一定会被执行的代码啊这个我们写句话说哎我啊好帅啊啊好好好这个失误啊啊好帅啊行哎这呢我们就写进去了,写进去以后的话呢,我们执行一下,也确实呢能够看到说这个代码呢执行了。带接入是吧,这里边呢,你别看到这红色就很紧张啊,这个红色呢,是咱们自己在这写了一个1.printstas导致的,实际上我们这里边异常呢,相当于你是处理了啊,相当于是处理了,但大家好像会觉得说这个处理以后跟咱没处理好像差不多是吧,这个咱们等下说这个事儿啊,那我们现在呢,相当于是处理了整个这个红色的信息呢,是我们在这个位置报出来的,那么执行完以后的话呢,我们发现这个finally代码呢,也执行了,也执行了,那这样猛一看呢,好像也没觉得有什么区别,为啥呢?因为咱们这个finally好像你不写的时候呢,咱们当时在这个位置,我加上一个,再说一个,我好帅,发现好像也可以是吧。
03:29
多加几个叹号啊,来证明一下确实如此啊,哎,这个时候呢,我们执行它也是,当然你这时候要加的话呢,这个你这突然相当于蹦出来这个结构了,我们把它呢,先暂时呢去注一下,OK好,你看这时候呢也能出来,就是我们TRY开呢,咱们说了你TRY当中有异常,我把这个异常呢,都给你解决掉以后呢,后边这个代码呢,能够正常执行,那现在的话呢,呃,我们这样执行就OK了,那你要是没有用它的话呢,把它打开呢也行,就目前咱们这个这个例子的话呢,好像体会不出来,所谓的说你非得要把它放在这里了,因为我放在这儿呢,其实也OK,那么怎么就能体现出来的呢?哎,我们说呀,这个try catch当中,我们在这个catch里边有可能呢,你还会有异常。
04:17
就是你开始当中有可能还有异常,以及呢,我们方法执行,我们说方法有的时候呢,会有返回值,你要方法有返回值,咱们说呢,比如说我在这个这个当然没有了,一会咱们举例子,比如在这个位置我要有个return,就意味着我要是执行到这儿没有异常的话呢,Return方法就该结束了,像这种情况要是出现的话呢,我们说finally这个作用呢,就能体现出来了,它叫做呢一定会被执行,另外之意呢,如果你这个执行到这的return了,先别着急,Return呢,我这还有个finally,你得先让我执行了,诶这个时候呢,它的这个作用就能凸显出来,所以呢,我们这呢,先说明一下,首先呢,它是可选的,根据实际情况,有没有说一定要被执行的代码,有的话呢,你就写,没有的话呢,就不用写了,这是第一个点,第二点怎么体现叫一定会被执行的代码,我们在这说,嗯,就是即使哎或者这样写吧,说finally类中这个声明的是声明的是一定会被执行的代码。
05:17
啊,即使即使什么呢,咱们这个,比如说这个catch中又出现异常了,这是一种情况,以及呢,我们TRY中有return语句,或者说呢,咱们这个catch当中可能也会有return语句诶等情况,也就是说呢,即使你有这些情况的话呢,也不会改变finally当中存放呢,是一定会被执行的代码这样的一个事实,比如说看啊,我们在这个位置这块的话呢,可能大家觉得不是特别方便了,我暂时注意一下,咱们就嗯,直接我在这里边,我再怎么着呢,我再写一个其他的异常。
06:01
写一个比较比较简单的一个异常简单异常写个什么呀,写个数组的吧。这样子我在这呢,去打印一下叫AR2,我写一个十行,那么上边呢,会出现一个叫算数异常,直接就蹦到这了,蹦到这儿以后呢,我们这又出现了一个异常,那这个异常呢,现在咱们是不是没有去处理啊,没有了,你也没有在这再加一个踹啥的啊,那没有处理,按说呢,这时候一旦出现异常了,这个程序呢,是不是就该退出了,他退出的话呢,诶不是往这退了,是整个的这个把这个方法整个就结出了,那如果我们要是用这种方式写,跟这种方式写就有区别了,现在呢,我们还是用的这个family执行。好,你会看到这个语句执行了,然后这呢,这不是咱们报的这个叫auTo Bo exception了,行这呢就体现出来我们这个finally确实会执行,但是你要是不用finally,你用这个这个他就不会执行了。
07:02
那这时候呢,他就不会执行,那因为呢,你这个没有说他非得执行,因为出现异常了,程序这个方法就算是终止查就啊行,那这个的话呢,咱们就稍微体现了一下,就这个finally,它放在代码呢,确实一定会被执行,然后再举个例子呢,说明一下这个return的事,我这呢写一个有返回值的word,嗯,别word了,In了。写一个method的方法,这样,然后呢,在这里边我写一个来写个这个TRYTRY里边呢,我们可能会有相关的一些这个代码了,比如说我就先诶放下这个结构CTRLC。放在这了,放在这以后的话呢,我们在这个位置呢,我就暂时呢,也先不放东西了,我就直接catch一下,咱们这个异常呢,叫做a index out of Bo exception啊写个E。好,这呢我们1.printsta行,这呢我们写个finally finally这呢说诶说哎,我一定会被执行,我一定会被执行好保存一下,目前的话呢,我们这个方法,人家要求返回值,现在呢没有,所以呢他就报错了,那这个位置呢,如果你要程序代码执行到这了,那我在这里边呢,我就写个return,给我写个RETURN1。
08:25
那还报错,为什么还报错呢?因为你要是万一要出异常了,是不是不能这给处理了,你处理完以后呢,这个位置是不是也得考虑,你得返回一下,哎,我就写个RETURN2,那这时候就没事了,就是你要没异出异常了就RETURN1有异常了,这不就出来RETURN2了,就这个情况了,行,那目前为止我呢去执行一下这个方法,这呢我们直接呢就调一下这method前面呢去接收一下啊int的一个number值,这呢我打印一下这个number保存好测试。
09:06
行这块呢,咱们确实出异常了,出异常的话呢,呃,这个我们finally这个代码呢,也执行了,就是不影响它的执行,那同时的话呢,这个它相当于是这种这种情况啊,我们这个程序呢,执行到这出异常了,它就蹦到这块执行,把这个语句呢就输出了,输出以后的话呢,按说我这有个return return呢,咱们说就要结束这个方法了,那就相当于我这个直接又该返回是个二了,当然呢,我们说等等,还有一个finally呢,诶finally呢,我们说我一定会操作了,所以呢,你得先把我这句话呢先给执行一下,所以他就执行了,执行以后呢,你把你这个呢就返回。就是这个意思,那如果说我们要是没有这行代码,它就不会出现异常,不会出现异常呢,按说就该RETURN1,那瑞RETURN1的话呢,也是等一等,我这有个finally,那就是把finally呢也得给执行一下,然后呢你再return,所以你会看到我们这个诶没有异常的,这个时候呢,虽然一返回了,但是呢,我们这个finally呢也执行了,诶就是这个意思啊那考大家一个问题,这呢RETURN1这二你说我要在这里边写个RETURN3,那这时候这谁说了算,Returner应该是谁,肯定不会返回俩了,你这只能是返回一个,应该是谁呢?对,这时候呢,就成三了,就成三了,哎这个呢,就是说按说呢,我执行到这出异常了,我该执行他了,执行他以后呢,对二这时候呢,诶要出去了,等等,我这还有个finally呢,结果呢这块。
10:44
执行完结果呢,这个就在这等着,说你啥时候执行完,你告我一声啊啊这块呢,我就出去了是吧,没告你,哎就他给抢了,哎从这呢也能看到我们这个final里里边呢,一定是会被执行的,行,那通过呢,这样的一个例子呢,咱们去体会一下finally里当中的代码,确实呢,是一定会被执行的代码在这写的,这个问题好,这个呢,清楚以后我们接着说第三个问题,什么情况下我们才会把代码写到发这里当中。
11:16
对吧,知道你的作用了,我得知道我什么时候要用啊,这里边我们要提到一个问题,这个问题呢,在咱们这个之前的这个第五章有一个垃圾回收的说明,这个垃圾回收说明呢,咱们之前呢,这不是讲这个object的时候呢,说过这个finally带着大家看过,然后上面呢,有一个相关的一个这个这个文字哈,说这说呢,这叫垃圾回收了,但是呢,对于其他的一个物理的连接,比如说数据库的连接,输入输出流,或者像我我们讲那个网络的时候呢,要讲到socket,那对于这些操作的话呢,我们这个GM呢,是无能为力的,无能为力的意思呢,就是它不能够帮你把这些所谓的连接呢关掉。
12:00
那就需要呢,我们手动的去把这些跟物理上有连接的这个操作呢,我们自己去关,那你要不关的话呢,一方面呢,属于有泄露的风险,另外一方面呢,最起码你这个内存还始终在占用,也不合适啊这呢我们就相当于是对于这样的一些连接操作,我们须要自己去关闭,就不要忘了,这就属于我们必须要执行的操作,即使呢,之前的你的代码出现过异常,那我也必须呢保证我们这个连接得关掉,所以呢,我们就相当于要把这些结构放在咱们的family类当中啊这呢我们写一下啊说呢像像什么呢,像咱们刚才说的叫数据库连接啊,像这个输入输出流,输入输入输出流,还有呢,咱们讲这个网络编程中的这个socket等资源,这。
13:00
这个GVM呢,是不能自动的回收的啊,自动的回收的,那么就要求呢,我们需要自己手动的进行资源的一个释放,我们需要自己手动的进行资源的一个释放,那么这个资源的释放操作我们就得声明在发点当中,资源释放就需要声明在这个finally里当中,那为什么非得要放在finally里呢?就是因为咱们得以防你这些关闭的这些操作,或者要释放这个资源的操作呢,受到你上边这个代码有异常的干扰,导致呢,它不能执行了,这个是不可以的,我不管你上面有没有异常,我这个操作是一定要被释放的,所以我们才会生明在这个发当中,行,下边呢,咱就可以举一个例子。
14:00
诶,Public avoid test,咱们来说一下这个我就写一个TEST2 test2啊保存一下,那这块呢,关于资源的释放,实际上咱们刚才写的这代码里边呢,有一个这个情况就是咱们呢,诶这个上午呢,最后写的这样一个代码,这个代码里边的核心的操作呢,这不还是他嘛,我把这个呢,就CTRLC一下粘过来,那首先呢,先ctrl shift o啊这个已经导过本了,行,可以用了,然后这里边呢,我们看到会有这样的脊柱异常,这脊柱异常的话呢,咱们说得需要去处理一下了,得需要去处理,否则的话呢,这个编异就不通过了,那咱们上午的处理方式呢,是这样处理的,咱们是把整个这个呢,就整个包起来了,放到这个踹当中,在这呢有一个快捷的操作。哎,有个快捷操作,上午呢是咱们自己手动的给它包了一下,快捷操作呢,就是你把它选中以后点右键,点右键有一个叫surround with surround with一个TRY开block,使用这个TRY开这样的一个代码块啊给它包起来点一下能处理好它就。
15:09
哎,这跟咱们上午自己写的时候一样嘛,是一样的行,那此时呢,这个,呃,这个叫编译时这个异常呢,我们通过拆开始处理以后呢,它就能够编译通过了,哎是这样个情况,咱们上午呢也是这样写的,但是这样写呢,我们说啊不太合适,哎上午只是说不让他去报这个编译是异常了,但是呢,这样处理呢,其实是欠妥的,为什么呢?对你看这个位置呢,刚才会报异常,这个位置可能会报这个位置可能报这个呢,恰好就是我们所谓的这个输入输出流的这样的一个资源,这个资源呢,咱们说它不会被自动的去回收,需要咱们自己手动的去close,但是我这个close呢放到这儿了,这个资源呢很危险,因为万一的话呢,就是在这儿假设他没有出异常,没有出异常意味着我们这个资源呢,就已经被创建成功了,创建成功以后的话,我下去read,那有可能这个read的时候是不是就报异常了,他要一报异常这时候直接就蹦到。
16:05
这个这个不会,他直接就相当于找这个了。因为这块人家是个IO异常了啊,直接就去找我们这个IO exception到这呢去处理了,那处理完以后呢,就开始往后走了,这个close的操作是不是就给忽略掉了,相当于你这个资源呢,你你是创建了,然后没有给它去释放,那此时呢,我们就不能够把这个操作写在这儿了,那不能写在这CTRLX我是不是就得放到finally里里啊,哎,我就得扔到这了,但往这一扔呢,一看哟,这个FX说没有定义,一看哟,写到里边了,写到里边了,你要说哎,我把它这个扔出来,扔出来它又有异常了,反正又得扔进去,扔进去了又看不着,又得扔出来,就这样扔过来扔过去是吧?啊怎么办呀,对,这咱们上午说的这个经验就来了,哎,我把这个声明放到外面。诶声明假设我就先先不写了啊,就这样,哎,然后把这个呢就干掉,但是这时候呢,他还是会报,这人说你这个变态呢,可有没有可能没有初始化,这咱们上午不是也说过这事,记得你给人家加个no,哎就有可能你这里边没有给人赋值,这我得有一个值有个值才行啊,所以呢,先写个no,写完no以后话,诶还报错,因为呢,你毕竟是不是还也会报一个I exception。
17:25
就他自己呢,他还出异常,他自己还出异常,那是不是就还得去处理一下,所以呢,你在这个你直接放到这儿你就能看到,还可以呢,去进行SC。呃,上面是咱们要讲的第二种方式,先忽略掉啊,哎,你点一下,这不是直接呢,就帮你把这个呢拆开一下,就是大家呢,回头也不用非得自己去手写了,直接点一下就出来了,但是前提呢,是你先会手写啊,开始还不知道怎么写呢,然后就哎就点了,那不合适啊行,那这样的话呢,我就放进去了,那通过这个呢,咱们也能看到什么呢,就这个try catch的操作啊,它其实也是可以嵌套的啊把这个事呢,咱们写到前边这样的一个知识里边,我就写到这了啊说呢try catch结构,TRY开分类结构结构啊可以哎相互嵌套,哎就可以嵌套了,别相互了,就是根据需要,像我们这里边呢,必须要把这个close的操作写到find这里,但是你本身又出异常,那就里边再套一层就可以了啊,那么这样的话呢,我们就能够保证什么问题呢,就当我们这里边呢,把这个流呢就创建了。
18:37
框建以后的话呢,这个关闭,假设关闭还确实呢,出现这个close,呃,Read确实出现异常了,这时候你就蹦到这块去执行,那就把这个呢处理掉了,处理掉以后的话呢,我们这呢,也一定会把这个资源关闭掉,因为这个呢,咱们上面没出异常,这个资源呢,确实也都创建成功了,哎,这样子啊,但是这个代码呢,离最终的这个代码还差一点意思,我说呀,我还得再补一行代码,补要什么代码呢?我在这个位置我得再加一个if叫f is不等于no,呃,因为呢就一行逻辑,我就省略这个大括号了,问为什么?对,为了避免一个控制人异常,很显然是吧,你要是闹的话呢,这一执行就控制人异常了,哎,他他会会有可能是闹吗?哎,对,应该说的对啊,就是这个位置,它本身是不是还可能会抛异常啊,咱们刚才就会看到这它本身还会抛异常,就抛到这个异常。
19:37
找不到文件的异常对吧,就是说我万一要是这个文件确实没有,就是在这块创建资源的时候呢,这个资源都没有创建成功,资源你都没创建成功,意味着你这个就没有拗好,这不就还是个闹嘛,但是你这块呢,本身你这块就抛一场就执行到这儿了,但是你这个呢,就说一定要执行,那我就过来执行,一执行呢,你这块本身又没创建成功,是不是又这块又报了一个控制针了又。
20:03
这不就成这个问题了吗?所以这块呢,咱们给他补了一个说,哎,你在不等于no的时候再执行啊,你要等于no相当于资源就根本就没创建好,那我就不用去关了,就这个意思,刚才这些呢,咱们都是这个理论的分析,那咱们呢,也可以让大家看一眼这个效果,这呢hello文件,我这里边呢,就直接写完hello,后边咱们讲IO流的时候呢,会详细的说这块这个hello文件呢,是一个相对路径,它的路径呢,就相当于在咱们当前当前的一个工程下,这个艾特硅谷,呃不是艾第16点右键我去呢new一个file file呢,这不看到这名了,叫点TXT,你就写一个hello.txt行写好了,写好了一边写好以后呢,里边呢,你可以写相应的一些这个文字了啊对吧,Hello,北京注意这时候呢,大家先别写中文,先别写中文,因为咱们这呢,用的这个流呢,是一个字节流啊,先别处理这个字符呢,就写这个abcd就可以了,写完以后回过来。
21:04
我们现在呢,就读这个文件,其实就相当于读到它,读完它以后呢,我们去创建这样的一个流,然后下边呢去读数据,然后呢,诶这个正常的一个关闭,如果呢都没有问题,它呢实际上是可以我们从控制台上去输出的,你看我们执行一下OK。诶大家看这时候呢,我们就是个正常情况,此时呢没有任何异常,这呢就算正常输出了,哎就读到我们这个内存当中了,就那我要这写了个hello,一显然呢,此时咱们这个文件呢是找不到的,此时文件找不到,找不到的话呢,这个如果你要是忘了写这个不等于闹了。它也会执行它是吧,在这里边会出现什么情况呢?我这出来一个file not found exception了,他碰到这块呢,又打了一堆红条,但是这块呢,这是一个异常给打印的信息了,实际上整体来讲呢,是是能过得去的是吧,但是你到蹦到这儿呢,这不又又出问题了,哎,对,你看这时候我们要执行会是什么样子。
22:07
看啊,这块呢,报了一堆红,这叫系统找不到文件po叫file not phone exception,这个这一堆红是咱们在这块呢打印的,咱们是在这块打印的,但是你会看到这块呢,怎么这也出错了呢?这块的错是因为咱们后边呢又出来一个控制针,在49行出的。所以呢,咱们写的时候呢,要把这个打开,就是你要让他加一个判断,那此时呢,咱们再去执行。诶这时候呢,是打印的这个错误信息了,其实这个异常咱们给处理掉了,所以你会看到这块呢,没有任何的异常了,咱们给处理了,刚才红是因为你这块红,所以呢,为了避免这个出现,加一个不等于no,这个代码呢,后边咱们讲IO流的时候呢,会说这就算是到目前为止,先不谈效率问题啊,先从只是从我们这个代码的这个合适不合适的角度来讲,这呢是一个相对比较完美的一个操作了。
23:05
行,这呢我们就把它呢就处理好了啊嗯,这呢就完事了。
我来说两句