00:00
OK,咱们继续昨天这个内容呢,往下来讲,昨天呢,我们是说到这个异常处理的第一种方式了,诶这种方式的话呢,我们称为呢叫try catch finally这种方式,下面的话呢,我们主要呢,来说一下这个finally的一个使用。OK,那finally的话呢,它呢所体现的点这块呢,你看我们写的啊,说无论呢是否发生异常都无条件执行的语句。我们把这些语句呢,就放在这个finally当中了。来,那我们来体会一下啊,这个finally的一个使用,所以这块呢,我们在当年这个包下呢,去新建一个class,我们就来讲一讲关于finally它的一个情况。啊,这呢,我们就不写没方法了,咱就直接单人测试了。Test,好,这先写第一个。就过来了。呃,这个单元测试呢,稍微的我们再说一句啊,就是大家之后呢,再去导入这个的时候呢,这个时候呢,我们如果要想在当前的model下呢,使用单元测试,哎,这个其实呢,有好几种方式哈,第一种方式呢,也是我们给大家说的这个方式,由于呢,咱们之前在讲这个注解的时候呢,已经呢是把这个library呢给大家导进来了,那么之后呢,大家凡是在一个新的model下呢,你想使用单人测试,哎,那你需要呢,在我们的这个位置啊,然后呢,有个加号选一下这个library,你把这个单元测试的这个。
01:18
哎,相应的一个库呢,你给他选中,选中以后呢,添加过来以后,还记得把它改成是一个compel这样的模式才可以。这是它的一个使用范围,然后这时候的话呢,你在当前你选中的这个model当中就可以使用这个单元测试了。那其实这个单元词的话呢,它有好几种可以导入的方式哈,包括呢,我们在当前这个model下呢,你自己新建一个label文件夹是吧?诶然后呢,你把刚才我们涉及到两个炸包呢,给大家直接添加进来,这也是一种方式,但这种方式呢,我就不说了啊,咱们之前也没讲,还有一种方式呢,更方便呢,就是你能联网的情况下呢,其实呢,直接啊,他如果一开始这块报这个错误了。哎,这个时候呢,你直接呢,我们通过联网的方式呢,也可以,哎,我稍微的举个例子啊,比如说你看我这块右键一下。
02:02
啊,比如这块我去新建一个modu啊,假设呢,就叫零名了啊,诶我这块创建好就在这儿嘛,在这里边呢,SC下我就随便呢,我去创建一个。包,比如叫com点艾硅谷点,诶Java这个咱们前面说过的这个包名,大家不要以Java开头,当然呢,你是以Java为后缀的是没有问题的。另外呢,还有一个点就是大家这个在起名这个报名的时候呢,你不要这样写哈,你像我这里边这个Z的话呢,实际上是一个关键字啊。这次啊super呀是吧,这些呢也都不行,你要非要想写,我就是想测一下这次的使用,这个呢,你可以自己给他处理一下是吧,比如加个下划线这个它就不是这个关键字了,就没问题。好,然后在这里边儿呢,比如我就随意的去写一个,比如说叫TEST1是吧,这是我们这个文件名,注意这个文件名,或者我们这个类名呢,大家也不要叫test。你要叫test的话呢,那就麻烦了,又跟我们单元测试里边这个也叫test,他俩又重名了,所以导致呢,可能导入的时候呢,会有点问题啊好,那下边这块的话呢,你看我这呢,自己写一个fair test。
03:04
Test啊,这时候呢,它是识别不出来的。啊,我们自己呢,去写一个这样的一个单测试方法,它这不是报错吗?那第一种方式呢,就像我刚才说的,你给当前这个Mo呢,去添加一个,呃,就刚才那个library是吧?第二种方式呢,如果你有网的情况下呢,直接我out回车,然后呢,这块你去添加一下使用那个四,注意就别选五了啊,就选这个四好,然后呢,这块呢,会提示着你使用这个版本,我们直接点上OK。这个呢,会联网的方式呢,给我们去把它这个库呢下载下来,如果呢,之前已经下载过了,他就直接呢做一个依赖就可以了。哎,这呢是比较方便的一种方式,那如果大家有网的话呢,这个呢,建议呢是最好的一种选择啊,OK,行,这个我们就穿插着先说一下这个事儿,那如果没有网的话呢,你就选择我们刚才说的第一种方式啊好,那么在这里边儿呢,我们去体会一下关于finally的一个使用,OK,关于它的一个使用的话呢,我们前面也讲到过啊,异常的一个。啊,情况包括呢,异常的一个简单处理,我们在讲这个track的啊,这个位置的时候呢,其实也体验过。
04:06
OK行,那我们稍微的比如说拿一个这个代码呢,来说一下。啊,先说一下好,CTRLC一下啊,我粘过来。好粘过来以后呢,这块我就把它呢先删了啊。OK。哎,什么意思啊,大家看一下,呃,我这呢是一段代码,这段代码的话呢,说可能会出现呢,叫number form me的exception,然后呢,我们这有个catch给处理掉了啊,这块呢有个输出语句,哎大家呢,实际执行的时候呢,发现。啊,发现什么呢,说呢,确实呢出现异常了,而且呢,这个异常呢,我们在开始里边还给补货了,补货以后的话呢,相当于这个程序呢,咱就算是相安无事了,那么后边这个代码呢,就是我写在这个位置的,其实呢是可以继续执行的。那就是我们看到的这样的一个场景了。那么可能有同学就会想说呢,我们写在开后边的这样的语句,他这不也一定会执行吗?那为什么我们还要刻意的考虑整一个finally?
05:03
对吧,诶可能会有这样的一个疑问啊,首先呢,明确一点,这块的代码呢,确实会执行啊,似乎呢,跟我们现在这样的写法。你看我这来一个二啊,我呢刻意的把刚才呢,下边这个输出语句呢,放在这个finally里了,好像呢,感觉不出来上下两个有什么区别。反正你也会执行,我这我也会执行啊。哎,先跑一下看一下。没有问题是吧,哎,确实呢也执行了啊,那么诶真正有什么区别的呢?其实呢,这块呢,通过这两个例子呢,似乎呢是看不出来的,但是呢,我要重新再改一下的话呢,你就能够看到他们的这个区别了,比如说我们在这个try catch里边,这个catch里边呢,万一要是也有异常呢。说这也可能吗?有可能啊,比如我就简单的,我就这样写一下了。啊,这儿呢,我们说呢,在哎开始中。哎,存在异常。那这个异常呢,我指的就是他可能会抛出一个异常的对象,而这里边的异常对象呢,没有地儿给他去做处理了。
06:07
那如果说我们要是使用上面这种方式来写的话呢,这句话呢,是不是就不会执行了。你看我CTRLC一下啊,咱们在这儿,哎,这一句言外之意呢,就是上面这代码执行到这儿的时候呢,出来一个number for me exception的对象,在这呢给开除掉了,开掉呢这个打印一下对战信息,然后呢,接下来啊,你又出了一个异常,这时候呢,我们出的异常呢,是一个运行时异常,这个异常没有任何的补货处理行为,整个呢就抛出个对象,整个程序就停了,它呢不会调用。哎,这块我们来看一下。那。诶,上边这个呢,是我们自己打印的啊,下边这个的话呢,是一个运行时异常它自动抛的。OK啊行,这个呢,就没有去打印,我们说叫程序结束了,而我们下边这个,哎,走一下。你看他呢,就会打印。哎,所以说这块呢,他们二者的区别呢,就显示出来了,但如果说我们有什么呀,就是一定要被执行的代码的话呢,我们就可以把它生明在这个family类当中了,这个呢,是其中的一种场景而已。
07:08
好,先回过来,我们把这个事儿呢先说一下啊。嗯,在这关于finally的理解,那这块我们要说的第一个事儿说呢,我们将什么样的代码写在finally当中呢?就是一定要被执行的代码来声明在哎finally结构中。诶,这个大家去体会一下,那这个既然呢,我们是把代码写在翻里了,这里边儿这个代码呢,是一定会被执行的,那都包括哪些情况呢?我先把这个事儿呢写一下啊,他的一个更深刻的理解啊。哎,这个更深刻理解呢,是什么意思呢?我先把这句话写一下,说无论。哎,无论什么呢,咱们这个踹中啊或K中。啊,是否存在啊,仍未被处理的异常。
08:02
啊,这是一种情况啊,再者呢,就是无论这个踹中或开始当中。哎,是否存在,哎,这个叫return语句。哎,等是吧,哎,就是不管你这样还是这样,我们finally声明finally当中的这个语句哈。啊,声明的这个语句都一定要被执行。诶,所以通过这个呢,大家再去体会一下,你像我们以前讲说return,一旦执行到return的话呢,你当前这个方法呢,就要结束了,那如果在结束我们这个TRY,或者是呃,开始这个结构的时候呢,不好意思,我这个finally,那finally的代码呢,也一定要被执行。啊,这个注意一下,好,那么这块呢,我们想说明这个问题呢,非常简单,咱就直接来看一下上面的我有个叫interview啊,就是企业的这个笔试题,这几个笔试题呢,就充分的来,哎,这个演示一下,我们关于finally一定会被执行这个事儿,好来看这个问题。这呢我写了一个test,是一个static,直接在may方往里边去调,写了一个12 12呢就传过来了,这呢做了一个转换,哎,转换为这个int类型的,这个我就没接收啊,呃,那么在转换的时候呢,这个是实打实的是可以转的,所以这儿呢没出异常。
09:15
哎,这个呢,正常来讲呢,我们执行return,一按说呢,就该结束这个方法了。但是别忘了,我们有一个finally。哎,那就意味着我们这时候执行的时候呢,呃,返回的结果呢,倒是确实是一,但是呢,在返回一之前,是不是这个要执行。哎,所以这块呢,我们的运行结果。哎,你看先有一个这个test结束,然后呢,你这个返回的是一一呢,在这儿打印了一下。那这个大家呢,去体会一下啊,就是即使你有return,那不好意思,我有finally,那就一定会执行,那如果说这个代码呢,你是这样写的。哎,这样写的话呢,你看他还给报错了啊。那你猜测一下,他为啥报错呢?对,说你这个无法执行是吧,呃,因为呢,我在这个TRY当中也好,Catch当中也好,你看我都有return,你这个是没机会的哈,但是你要写在finally当中,这就不一样了。
10:07
好,这是一个,然后呢再看第二个,第二呢跟第一个呢,代码其实没什么区别,主要呢,就我们传这个方法的参数变了,刚才呢是一二这个呢写成A了,诶明显呢,这个位置呢转是不成功的。所以呢,就抛出一个number for me exception的一个对象了,然后呢,在这呢,给catch了。开始的话呢,这个就返回负一了。哎,你开始呢,要返回负一,那你等一等,我有finally。所以呢,也是先把finally先执行完,你再返回这个负一给这儿,然后打印负一,所以呢,这个的运行结果就是test结束负一。诶体会一下啊,不管你这个TRY里边和开里边有没有这个return语句,我们这个结构也一定会被执行。啊,那刚才呢,我们在这里边写的这个例子,呃,刚才咱们测试的时候啊,这呢是相当于是我们在这个cash当中有一个没有捕获的异常,然后呢,他也得执行。啊,体会一下,好,那我们再看一下第三个例子。
11:03
就这个了啊。这个例子的话呢,传了个A,传了A就在这儿了,这是一个一,这是个负一,区别呢就是在三类里边,我写了一个return。那这个return。这是A是不是应该在这抛异常了,放到这是吧。嗯,按说呢,该返回负一了,但是等一等,我这有finally,是不是先执行finally。那X呢,这个就输出了,那最终的结果是返回零还是返回负一呢?哎,对,注意这个时候呢,返回就是零了,按说呢该负一,但是呢,是不是他给抢着走了是吧?哎,所以呢,这个结果的话呢,哎这个呢会输出,然后呢,返回的呢,是finally当中的这个返回值了。你看零。哎,提前呢就抢走了,哎这个大家体会一下。好,这个OK的话呢,我们再来看下边这个。下边这个啊,我这呢写了一个十,这个十就进来了。
12:01
这个十就进来了啊,然后呢,呃,这个时候呢,我们也没有任何的异常出现,所以呢,Cash这个呢是没机会执行的。然后呢,直接就到finally了,Finally呢,这句话会输出,然后会输出这句话。十进来,那这个呢,结果是多少?十还是11?诶,第二刚才第三个要看懂了,这个呢,其实也应该能比较快的做出来的,就11吧。那十传过来以后呢,这个呢,呃,按说呢该RETURN10,但是不好意思呢,我得先执行finally里了,所以这个输出完以后呢,是不是加加了前加加这不就return了11了吗。11呢,就给作为返回值给返回回去了,所以这个结果不就是11吗。啊,这个应该没啥问题啊,哎,然后呢,我把这个给入掉,把这个打开。这道题的话呢,确实呢,有一些笔试题当中考过啊,也有很多同学呢,也确实呢做不对。
13:02
那咱们就顺带呢,把这个题目呢也说一下了,借着这个finally的使用啊,这个操作呢是有难度的。啊,它的结果是多少呢。哎,同学呢,还是11是吧,哎,如果还是11的话呢,这道题呢,我就不用刻意的去讲了是吧?哎,它的结果呢,是十。对,这个你看不一样了啊,嗯,这个怎么去理解呢,咱们走一走啊,这个是十传过来,按说呢该惹成十了。哎,但是呢,你等一等啊,我这块呢,还有一个finally呢,Finally这块呢,我们这一个叫test结束了,然后呢,诶这个我们没有它啊,直接就它把这个number呢加加了前加加的。这个其实你前加加后加加无所谓了是吧,因为他也没有其他的操作了啊哎,总之的话呢,零按说变成11了是吧。好,那变成11了,然后呢,大家回过去说,Return,诶,这不该11了吗?哎,这是我们的一厢情愿啊。实际情况的话呢,这个呢,要说细的话呢,就得需要呢去讲一下,咱们说方法呢,不都是一个战争吗。
14:06
这是一个战争,然后呢,我们这个number的话呢,我们都说呢,它是一个局部变量了,局部变量呢,要存在这个战争里边,其实要细说的话呢,这个战争啊,又分成好几个部分啊,其中最重要的两个部分,一个呢叫局部变量表。啊,另外一个部分呢,叫做操作数占。局变量表它是一个数组,就是来存放我们这里边的局部变量的,局部变量表嘛,就放局部变量的啊,比如这number的话呢,诶,它就会放到相应的这些位置,你要还有别的变量,那就该有几个,你就在这去声明就可以了,然后操作站它是个站结构哈,就他这里边还有个站结构,这个哥们干啥呢?就是我们临时的一些运算的数据呢,都会往这放。是这个意思啊,那么这个详细的我就不多说了啊,那实际这个过程呢,就是这样的,我们这呢是一个十过来了,把这个十呢给了这个number,这个number呢,就我们局部变量表里边的一个叫number啊。这个number,这个number的话呢,你不是负过来,其实它这个值呢,就变成十了。
15:00
没问题,然后呢,我们return的时候呢,这个return的这个数据呢,咱们都得需要呢,把它先临时放到这个操作站里边,所以呢,我这时候呢,在return的时候就把这个十呢已经放过来了。放完以后呢,本身呢,下一步干啥呢,下一步该return这个指令就让它出去了,这个方法呢就结束了。但是呢,这个时候呢,你说等等啊,我还有finally行,那我就。操作你这个finally里吧,Finally呢先输出了一下,然后number给大家了,这个佳佳你注意他直接呢,就操作的我们这个局部变量表啊,他把这个十呢就改成11了。改了这啊,那改完之后的话呢,说行回来了,回来以后那行我我该走了,他就接着走了,所以呢,是把这个十呢给拿走了。这个呢,其实本身呢,已经变成了11了。但是呢,他这时候是拿的这个原来,哎,我放到操作站里边这个十出去的。这个呢注意一下,所以这个结果呢是10OK啊。行,这道题的话呢,咱们给大家说一下,因为凡是呢,见到这道题的同学基本上全都是懵了,诶我们把它就讲了一下,那么诶,这个我们主要呢,想体会的是finally当中的代码一定会被执行,不管你是否在try catch当中存在没有处理的异常,也不管你TRY跟catch当中是否有return语句,总之我一定会被执行。
16:15
啊,这个注意实际上呢,这个里边呢,有一个极特别的一个例子。啊,只有一种情况的话呢,我们是例外的,这个例外呢,就是cm.X0。就是这个操作呢,相当于会导致我们这个程序呢,强行结束。就是除非你让我们当前这个Java虚拟机运行的这当前这个程序这样一个进程是吧,你让他强行结束,除此之外的话呢,Finally中的代码就一定会被执行。哎,这个大家稍微的注意一下就行,OK。好,这呢是我们说的这个finally这个事儿,然后另外的话呢,这有一句啊,大家稍微的关注一下,因为有一些特殊场景呢,我们可以看到这样的一个问题啊,诶我呢先把它拿过来。哎,这个我写到这儿啊。
17:02
哎,看大家能不能理解,说呢,Finally语句和case语句呢是可选的,但是finally呢不能单独使用,以前呢,我们讲sweet case的时候呢,说过那个default是可选的。啊,包括呢,If else那个else也是可选的,可选的意思就是你可以写可以不写啊。就是我们在写一些代码的时候呢,可能会见到这样的这个场景,说这不TRY开familyly嘛,诶比如我这个同步呢,我把它呢在CTRLC啊,我再整一份。又叫三了。那这个呢,语句呢,可能我就没写哈。你看发现的就是你不用看细节,你就看这个整体结构,嗯,TRY呢,后边是finally,没有catch。就是这个呢,在有一些场景下呢,可能我们也会写啊,就是这个TRY呢,它搭配一个cash型,可以没有finally,然后TRY呢也可以搭配finally,可以没有cash。那就这个意思啊,嗯,这种是什么情况呢?咱们前面也提到过了,对于这种运行时异常啊。上面写的啊,其实咱们通常情况下呢,就不处理了。然后编译是异常呢,咱们是一定要处理的,否则你编译呢也过不了,所以呢,在程序当中呢,如果我们说呢这个。
18:07
诶这个粘过来啊,如果我们说呢,这里边儿呢,可能有一些呃,运营时异常,那我就不管了,所以呢,我就没有开始了,但是呢,这个代码呢,万一要是出现一些运营时异常怎么办呢。哎,我这儿呢,还有一些一定要被执行的代码。那行了,那你就直接呢,写个try finally。把这个一定要被执行代码你放到finally当中。啊,然后就可以了,那因为运营是异常,我们可以不处理嘛,所以我就没有写catch了。注意啊,但是你注意啊,呃,可以没有catch,有finally,可以没有finally,有cash,但是你不能,哎,Catch跟finally都没有,只有一个TRY。那这就完全没有必要写出来了。那这个注意一下啊。这呢是我们说的这个问题,那关于finally呢,理解之后呢,我们下一个问题就来了,说既然呢,Finally中的代码是一定要被执行的,那我们在开发当中什么样的代码我们需要呢?把它放在分类当中体现一定要被执行这个事儿呢?
19:02
对,这里边儿呢,就涉及到了一些资源啊,有一些资源呢,是我们必须要手动的关闭的,你要不关闭JC呢,我会自动的帮你回收,言外之意就会出现内存的泄漏问题。啊,这我们在在这儿写一下啊说呢,哎,我们在这个,哎开发中啊,有一些资源啊,比如这个输入流输出流。哎,这个呢,是一些流资源来逗号一下,还比如说我们这个数据库的连接。哎,还比如我们这个,呃,Socket,后边我们讲这个网络通讯的时候呢,啊,Socket通讯。或叫socket连接啊等资源。啊,这呢,就是一些资源啊,这个我们可以加上一个小括号吧。说的有一些资源呢。哎,我们在使用完以后。啊,使用完以后啊,说必须显示的这个是第一个这个显示的啊,进行关闭操作。
20:06
哎,否则啊,垃圾回收器啊,我就说叫GC了啊,否则呢,GC呢不会自动的。呃,回收哎这些资源。啊,那么继而呢,导致。啊,内存的泄露。那这呢是我们看到这样场景,接下来说为了保证这些资源。啊,在使用完以后。啊,程序。啊,这个为了保证这些资源呢,在使用完以后啊,不管是否出现了未被处理的异常。啊,异常的这个情况下啊,这些资源。啊,能被关闭。哎,说呢,我们必须呃将这些操作,呃声明在。
21:01
哎,三类当中。OK,这个呢,就是我们呃说的这样一个场景啊好,那这里边呢,就提到了一个所谓的资源的一个问题了,我们拿其中的一个例子呢来说一下,咱们在讲这个异常处理的时候呢,这边是讲了说运因式异常呢,以后大家就不用处理了,主要我们看编异式异常,变异式异常呢,我们这里就写了一个例子。那当时呢,我们写的是这个try catch了,好,那现在的话呢,我们来看一看这个操作啊,我把这个呢给它CTRLC一下。哎,粘到我们这个下边。这个呢,就是我们在呃,实际开发中,诶,Finally的一个使用。好,我粘过来,这个咱们改成一个四好,大家看啊,这里边儿的话呢,我们存在一个资源的关闭。就是他。我说呀,目前的这种处理方式呢,不是特别好。啊,为什么这么讲呢?大家你看啊呃,我这个程序呢,如果进来以后,然后呢,这个位置呢,可能会出现一个异常,如果说这个位置出的一真的执行的时候呢,出现异常了,其实这块呢算还好,什么意思啊,他在这块出异常的时候呢,其实这个资源也是我们这个流啊,这其实是个流资源了,它其实并没有创建。
22:13
啊,你出现异常了,然后呢,直接这不就蹦到这儿来了,这块呢,把这个对战信息打印了,后边呢也没啥了。是吧,也没啥了,所以这个时候没事儿,但问题呢,可能是这样子的啊。这个程序呢,往下走这块呢,没有出现异常,那我们这个流呢就创建好了。双好,再往下走的时候呢读哎调这个瑞的方法时候呢,出异常了。这时候要出异常了,是不是就蹦到这儿来了?那这时候你把它处理了,处理完以后呢,你后续呢就没了。那么这时候你注意我们这个流呢,可是创建成功了啊。创建成功了,出异常了,直接呢就开始了一下完事了,这个操作没执行。所以说它其实会造成一个泄露问题。啊,这个要注意。
23:00
啊,这关于这种情况呢,大家可能觉得稍微有点懵是吧,就是明明这是一个对象,这个对象呢,我们都结束了,诶说你这看咱们这个方法啊,这个大家稍微注意一下。呃,这个方法的话呢,我们这块呢,这不是在这儿出的异常,然后呢,在这给开始了,这个呢就给打印了,然后这块也打印了,然后这个方法就结束了,呃,有的同学可能会有疑问哈,说这呢是一个战空间,这呢是我们这个T这个方法,这个方法呢,这不也都小括号呢,也都结束了,那意味着个这个战争呢,不就弹出了嘛,战争要弹出的话呢,这个战争里边呢,我们定义的这个f is是吧。上面那个变量呗,这变量不就也应该销毁了吗。哎,这个FS呢,我们不是让它指向B空间里边,你造的这样的一个对象吗。说这个指针呢,不是没有了吗?这个JC为啥还不能回收呢?诶注意啊,就是我们这个方法执行完以后呢,这个战争呢,确实弹出了。战争要弹出的话,你这个变量呢,肯定也是没有了。那这个这次呢,去回收它的时候呢,注意除了这有个指针之外呢,你还可以形象点去理解,由于我们现在是个流流呢,它需要跟咱们比如物理磁盘上的这个文件呢打交道,包括呢,网络资源也是一样啊,其实呢,它还有其他的引用指向着呢。
24:10
所以说你这个JC呢,在回收的时候呢,它还发现有别的指针指向,所以呢就没有办法回收,但实际上呢,你就没有自己的这个变量门去指向它了,你也用不了。就是从我们的角度来看呢,这是垃圾,但是呢,这个JC呢,发现还有别的引用指向呢,它就没有回收,怎么办呢?我们必须要掉下这个close,把其他的这种无关的这种引用呢给它断掉,然后这时候JC呢才能够把它回收掉。啊,否则呢,这不就泄露了嘛,是吧,那既然呢,这个操作一定要被执行,我们现在有这种风险的,说可能执行不了,那咱就必须把它放在finally里边了。啊,那这个代码怎么做呢?你看啊,原来呢,我们是都把它放在。踹里边了是吧,现在的话呢,你得这句话咱就不要了啊,我就得写一个finally了。可以这么着,然后呢,得把这句话呢,是不是给它拿出来放这儿啊。
25:00
哎,那我这块往这一拿的话呢,你发现诶它呢用的这个变量,咱们讲踹的时候说过,在踹里边生命的变量除了踹就看不见了。所以这块你看看不见是吧。那我们就得把它是不是拿到外边啊,它拿到外边呢,这块又用了一个它,那这两行是不是都得拿到外边。那我就拿到外边了。一拿到外边的话呢,说它有个异常。得去处理一下,还得拿进来是吧。一拿进来就看不见了,还得拿出去。这就很尴尬是吧,怎么办呢?对,怎么能够把它俩都完美的解决呢?就是处理异常的时候呢,还放里边,但是这个变量看不见,那你就不要在里边声明是吧。对,所以说我们声明的时候呢,放在外面。诶,然后里边的话呢,你可以呢,去给它赋值,这时候呢,既在里边处理了异常了,然后外边这个变量呢,我们也能看得见。两全其美。哎,就这样来处理。好接着来,然后呢,我们这个close的话呢,本身也可能会报一个编译式异常,所以这儿呢也得处理。
26:05
这个处理的话呢,我们还得再给他写一个踹。包一下。哎,这么着啊,然后再写一个这个开始,这呢还是IO的exception写个E。1.print,哎,就这样了。然后这块的话呢,现在我们又看到了这个拆cash的话呢,其实是可以嵌套的。你看在一个拆开里边,我们又签到了另外一个拆开,这是没问题的啊,这个呢,多少我们在这儿,诶可以写上这一句吧。就到这儿了啊。说这个,诶try catch这个结构啊,是可以嵌套使用的是吧?诶稍微的了解一下啊好,那么接着我们再回过来。呃,写到这儿的话呢,哎,我说呀,稍微的可以再严密一点。啊,严密一点怎么着啊,或者这个严密之前,咱们先捋一下这个过程吧,先说这个这个程序再往下走走走走到这儿了啊。走到这儿的话呢,现在你出现一个L异常。然后呢,我们这个异常的出现了,它就执行这了,执行这的话呢,我们就打印这个信息了,此时呢,这个流呢,其实上面已经创建成功了。
27:07
啊,那按说打印完它之后呢,该结束了,但是你等等我有finally,在finally当中我们把这个流给关闭掉了,这样就避免了内存的泄露问题。好,那这样写的话呢,我说呢还稍微差点意思啊,我可以呢,再加一个操作,让这个程序呢健壮性更好一点,那就是针对我们第一个情况出现异常。如果你要这块出现异常了,实际上呢,这个流呢,并没有创建成功。这时候要一出异常不就蹦到这儿了,这呢就是这块处理了,处理完以后我又finally要执行,这时候要一执行会。是不是就控制人啊?呃,因为呢,你这个位置并没有创建成功嘛,所以呢,你还是个闹吧。所以呢,为了让这个兼容性好一点呢,我前面可以补一个说if。哎,它不等于no,哎,你再去处理,因为就这一行了,所以我就省略大括号了啊。加个他。哎,能够规避你这个位置,如果要出异常的时候呢,我们这块呢,就不报控制人了,因为他就没有进去去关是吧。
28:03
哎,这个呢,小细节大家关注一下。好呃,这个事儿的话呢,咱们到后边讲到这个IO流的时候呢,还会继续说的哈,大家现在的话呢,你只需要记住一个点,就是将旅游资源的关闭操作呢,我们放在family当中。哎,这是咱们的一个重点是吧。加。流来资源的关闭。那操作。生命在。反当中。好,这个呢就说完了,然后这个呢,说完之后呢,进而呢,咱们其实这个finally的这个使用呢,也就告一段落了。最后这块呢,有一个常见的面试题,前面我们讲到这个final的时候呢,其实也稍微的提过这个事儿啊,翻的时候也提过,说呢比较他们三者的区别。其实呢,没有任何相关性。啊,Finally我们讲过了是吧,表示最终的是吧,哎修饰什么,哎,Finally的话呢,是我们现在讲的。啊,就是体现了一定会被执行的代码,放在这个案例当中,这呢是一个方法名是吧。
29:04
哎,这个呢,你就把它各自呢,稍微的介绍一下就行了。行,这个呢,我就不多说了啊。好,这是我们说finally的使用。
我来说两句