00:00
那刚才呢,我在这里都是给大家快捷键生成的,大家有没有发现,就是我在这是通过out回车快捷键生成的ROS,然后在这这个try catch是不是也是通过这个快捷键给它生成的try catch啊。哎,没事啊,那咱们会给大家详细的去讲啊,详细的去讲大家放心啊,来咱们继续看啊,这个体验成就是说到这为止,咱们要知道这个异常分编译时和运行时,编译时你得干啥,发生概率比较高,在编写程序的时候对它进行预先处理,怎么处理throw或者是拆开吃,是不是throw就是把异常往上抛,拆开吃就是把异常捕捉了啊。运行是异常,你愿意处理处理,你不愿意处理也行啊,无所谓,编译器没意见啊,没意见,这个发生概率比较低,这个发生概率较高啊,来咱们继续看。在这来一个,那这个class呢,我们叫做exception test06好,大家注意听啊注意听。
01:01
我们详细的讲一讲异常,处理异常的第一种方式。使用在方法声明的位置上使用throw关键字啊,抛出。谁调用我这个方法,我就抛给谁啊,抛给调用者啊,抛给调用者来处理。啊来我们来看看这里呢,有一个方法叫做M1M1方法,我给建出来,M1去调M2 m2方法我给它建出来,M2方法去调M3 M3方法,哎,我给他建出来,各位啊,都给它建出来。好,大家看这是main方法吧,是不是来这块呢,我们输出一个啊,比如这叫叫什么叫做men begin啊men begin,然后这个是mano。
02:05
Be over啊,然后这个呢,我们就叫做M1BEGIN,然后呢,这个呢,我们叫做M1O啊,然后这个呢叫做M2BEGIN,然后这个呢,我们叫M2OVER啊然后接下来M3方法这块,哎,我去调一个方法,各位啊,调用3JDK中某个类的构造方法,各位啊,这个类大家还没有学过啊,这个类还没有接触过啊,后期IO流的时候就知道了啊,我们只是借这个类来讲一下异常啊,我们只是借助这个类讲学习一下,学习一下异常处理机制,各位啊,别担心啊,来注意听了。那么现在这个程序的逻辑是闷方法调M1M1调M2M22呢在这儿呢,去调M3 M3方法里边,诶,我找了一个类,各位啊,我提前预谋好了啊,在Java这个IO的包下来找找啊,有一个I欧包,就这个包。
03:15
IO这个包呢,有一个叫做file,我们以F开始的file input有这么一个类。File input stream啊,这个file input stream呢,有这么一个构造方法,大家看构造方法是不是方法,构造方法是不是方法,是方法吧,我们调一下这个方法。这是个流啊,我们括号里边需要传一个什么,传一个文件路径,传一个文件路径,各位啊,来我们new一下调用过的方法啊,来调用构造方法,New它这个构造方法,我们这里需要传一个文件的路径。这啊,传个文件路径来,这个呢,Out,加回车把它引进来就行了啊,这个类叫什么呀?叫做哎,File input stream啊加va IO下面的这是一个啊,这是创建一个输入流。
04:03
对象啊,该流指向一个什么文件,这个位置需要填一个文件路径。这个文件的话,咱们随便找一个文件吧,比如说D盘下的COS01开课当中有一个学习方法,然后我们现在在这里写上叫做学习方法,把这个路径拿过来,直接贴过来放到这儿好吧。它为什么出现两个斜杠啊,因为一个斜杠是转移,明白什么意思吧,两个斜杠是不是代表一个普通斜杠啊?是不是好,这是一个文件路径,各位啊,文件路径有老师,这是什么东西啊,我不太懂,你不用懂各位啊,你现在只需要懂的是我new调这个方法的时候,这个方法出错了。明白吧,这是一个流啊,这是一个流,将来你这个文件里边不是有东西吗?对吧,我想把你这个文件里边的这个内容,文件里边个内容读到我Java的程序的内存里边,你就需要使用这样一个流,所以这个位置需要跟一个文件的路径,各位啊,跟一个文件路径,那么大家思考一下这个位置为什么会报错。
05:08
思考。思考啊,为什么这里会报错?该倒也倒了呀。你调构造方法,那你这块也有一个参数啊。参数跟字符串啊。嗯。不对,同学们,你们没有说到根儿上来,我再问一下大家。第四个例子,为什么这里报错?为什么这报错各位?我们调这个方法为什么报错?我再给你一次机会啊。我们在exception t04里边讲了调do sum的时候,这里报错了。
06:00
我们调do,萨姆这里报错了。那我们现在调的是这个方法,为什么这也报错?什么原因你思考一下。我觉得这个应该能想象到吧,我讲的这些东西是有铺垫的呀,我给你铺垫好,然后这块呢,之所以报错,我们点过去看源代码呗。行不行,看下源代码走好大家看。看见了吗?是因为你这个构造方法的声明位置上是不是有一个关键字。叫file not found exception or file not found exception的负类是IO exception IO exception的负类是exception。从这里可以得出一个什么结论?得出我们的file not found exception这个类是不是一个编译时异常?因为我们在这里掉了呀。我们掉了你的构造方法呀。
07:01
是吧?编译报错的原因是什么?编译报错的原因是什么?我解释了啊,编译报错的原因是,第一这里调用了什么一个构造方法。第二,这个构造方法的声明位置上有什么点,过去看看有这个。听懂了吗?有这个。第三,通过类的继承结构看到file not found exception类是IO exception。IO的类是。最终得知file not found exception是编译时异常。
08:09
错误原因。编译时异常要求程序员编写程序阶段必须对它进行处理。不处理编译器就报错,听懂了吗?现在你这个程序出错的原因是因为你没有没有处理这个异常。那以后老师这个没有异,没有异常啊,哪有啊,你点过去散公司源代码里边这个构造方法,大家看这个位置是不是。有一个生命的异常,而这个异常是不是编译式异常,你调用这个方法的时候,是不是没有处理它。那么我问大家,处理这个异常有两种方式,你明白吗?第一种处理方式就是怎么着?
09:01
明白吗?我们现在讲的就是啊。来,各位没处理出错的注释掉,再来一次,还是有错,我问大家第一种处理方式是不是上抛?是不是上抛各位。来啊,我们采用第一种方式啊,在方法声明第一种处理方式。在方法声明的位置上。使用。Rose。File not found exception。好了。这个类导进来。好,各位。注意啊注意,听我在这写上这个,立马是不是就没错了。
10:05
好,谁能猜到,为什么这儿还有红线。谁能猜测或者推测出来为什么编译器还是报错?你能说出来谁报错吗?好,我问大家问题,这个地方你是不是对异常进行了处理,所以这样是不是就没错了?当你写上它,是不是这就没错了?对吧,就没错了呀。但是你这个异常你要注意啊,你有人有有没有人去调M3。有没有人去调M3,有我们来往上推了啊,走走走,你看第二行报错。
11:04
因为M2去调了M3方法,M3方法是不是会有这个throws file not found except2file not found exception,它是一个编译时异常要求我们程序员在编写24行代码的时候必须对它进行处理吧,所以这编译器报错的原因是什么呀?编译器报错原因是什么?是。M3方法声明位置上有什么。有他。我们在这里调用M3,没有对异常进行预处理。所以编译报错明白吗?那编译器报错,你想解决这个问题怎么办?你有一个办法,要么在这捕捉。听懂了吗?诶,这个异常到此终止,大家看是不是就再也没有任何问题了,你还有一个办法,就是你除了这个捕捉之外,你还可以在这儿继续往上跑。
12:10
好,我们来抛别的行不行,Class exception。抛别的行吗?是不是28行该报错还是报错?对不对啊,抛别的不行啊,抛别的不行。啊,抛别的不行。这注释啊。别的不行啊,抛class。说明什么呀,你还是没有对谁处理?Not found。进行处理。我不知道大家有没有明白这句话。
13:03
抛别的不行,抛出class class,说明你还是没有对final not fund的exception进行处理。你看该报错还是报错?对吧,哎,那么我现在抛IO exception行不行。导进来诶。有意思,没事了。对吧?哎,所以说这一块啊,没问题啊,因为IO啊,它是个父亲,IO下呢有很多什么呀,子类,其中file not found exception是IO,什么是子类,所以你这对IO异常处理就相当于是对谁啊对file not found except已经处理了啊,已经处理了,就这意思啊,抛别的不行啊,抛谁啊throw啊抛这个file not found not exception负类。对象IO exception啊,这样是可以的,明白吧,这样是可以的,没问题。
14:06
因为IO包括谁,因为IO exception包括什么呀,Not found。Exception啊,IO exception包括found exception。啊,来,那我直接写一个最顶级的exception行吗?也没问题。对吧,哎,这样也可以,因为exception包括所有的异常。可以。啊,可以没问题啊,那有同学老师我这样写行不行?我写俩,我写一个class cast exception逗号完了之后再来一个file not found exception行不行?
15:03
行不行,各位大家看代码有毛病吗?是不是也可以有多个异常中间逗号隔开啊?对吧,哎,后面也可以写多个异常啊,可以使用逗号隔开,明白什么意思啊,哎,可以使用逗号隔开。啊,但是一般情况下我们的写法,比较正规的写法就是throws file not found exception,而我们这个写法恰好是idea工具为我们自动生成的out加上回车,诶,Rose,你看它自动给我们生成了它。好,那现在告诉我同学们那。现在程序如果是这样的话,哪又报错了?那为什么这儿的错误解决了,怎么还有错呀?你别忘了,是不是还有一个方法去调M2啊?M2,这是不是可能会抛这个异常。你看是不是在第19行出错了。对吧,M1去调M2 m2可能会出这个异常啊,所以M2这块呢,你必必须对它进行预处理啊,要么是TRY开,要么是THROW2个你选一个,两个你选一个明白吗?哎,两个你选一个。
16:14
啊,那么到这为止呢,我给大家讲的是什么呢?讲的就是这个。这个第一种方式,各位啊,就是说我们处理异常第一种方式,在方法生命上,谁用关键字抛出啊,谁调用我这个方法就抛给谁,抛给调用者来处理啊,你看我抛给谁了,抛给谁调我M1去掉了M2。那么这块这个异常怎么办,你来处理就行了,你来处理啊,就说白了,我M2方法在大关里面,代码执行过程当中。对吧,我执行到M3的时候,M3出异常了,M3一旦出了异常,一旦出了异常,我选择的是推卸责任啊,推卸责任把这个事儿扔给谁啊,谁调我谁处理,我不管这个事儿,我现在管的这个事儿就是把这个事儿上报上去,就是我管这个事的目的就是上报,明白吧,现在这就是我对异常的一种处理态度啊,采用这种方式就表示说我把这个事儿我负,我的处理方式就是上报。
17:07
啊,上报。嗯,你比如现在这个疫情对吧?啊,你比如说我们北京大兴区这块出现一个问题对吧,出现什么问题呢?啊,出现一个咱们这个有一个患者对吧,有一个患者生病了对不对?然后呢,我们有两种处理方式,第一种处理方式怎么着啊,哎,就是把这个信息怎么着,哎上报上报上去啊,第二种方式就是说我这个信息不上报,我自己捕捉了。是不是啊,有两种处理方式,各位两种处理方式啊,第一种处理方式其实是非常明显的上报方式啊,这种处理异常的态度是什么是上报。上报啊,那么处理异常的第二种方式,我在这里也说一下啊,哎,使用try catch语句对异常进行捕捉,捕捉啊,就是这个异常不会上报。
18:07
自己把这个事啊。处理了。明白吧,这个异常不会上报啊,自己把这个事儿处理了。就是异常抛到这儿为止,不会再往上继续抛了啊,异常抛到什么呀,此处为止啊,不在为止啊,不在上抛了。啊,不再上泡了,那么这个时候呢,我们这块哎,假如说啊,我再采用Rose是吧,那这边是不是就报错了,那么这边报错大家想想闷方法继续,如果再往上编译器再往上抛的话。是不是最终就抛给了我们的Java虚拟机?Java虚机是不是就终止程序了?各位,大家想一想。一般啊,不建议在main方法上使用什么呀。
19:05
因为这个异常如果真正的发生了,一定会抛给谁啊,GBMGBM只有终止。你异常处理机制的。一个目的作用是什么?各位注意啊,异常处理机制的作用就是增强程序的什么健壮性。对吧,哎,怎么能做到异常发生了也。不影响程序的执行。也不影响程序的执行。哎,所以一般men方法中的异常建议使用什么try catch进行捕捉,Men就不要继续上抛了,明白吗?所以这块呢,我们不会采用这种方案啊,当然你硬要采用这种方案,那也没没人管你啊,没人管你对不对,你你你乐意。
20:11
来,我们把这个拿过来啊,拿过来之后呢,我们放到这儿,大家看看,如果我们不使用这种方式,是不是就报错了。对吧,报错了怎么办呢?诶大家看从开始。TRY这个语法我再强调一下啊,来是怎么做啊,是TRY语法是这样的,TRY加一个大括号,然后catch表示捕捉,明白吗?Catch表示捕捉,捕捉一个异常,哎,有两个分支啊,这个里边就表示TRYTRY是什么意思啊,TRY是尝试。啊,尝试catch是捕捉异常之后走的分支啊,Catch是捕捉异常之后走的分支,你现在这块呢,你可写什么呀,可以写上这个fire什么呀,Not found exception,因为你要你要你要什么呀,你要抓这个异常,你要注意啊,小括号里边写的这个东西一定要加个变量名,加上变量名啊,加个变量名。
21:12
明白吧,哎,加个变量名啊,然后把上面这个放进去。啊,放进去好,来看这个try catch。这是处理了。在执行过程当中出了问题。对吧,会进到catch语句块中执行。嗯,可以这样理解啊,可以这样理解,来,咱们继续看啊,在main方法当中,我们去调me方法,在这里我们处理呢,就TRY开始进行捕捉,是不是那捕捉这块的话,那如果出这个异常,我们就说文件怎么着,文件找不到。或者文件不存在。可能路径写错了,可能路径错了。
22:01
路径错误啊,也可能。该文件被删除了对不对?哎,该文件嗯被删除了,给个提醒呗,对吧,给个提醒是吧?好了,那么大家要注意啊,大家注意。那这个程序我要执行呢。对啊,边异是异常。咱们现在讲的是编译时异常,只有编译时异常你需要才你你才需要这么做,你100除以零,我问你是不是运行时异常,运行时异常你看你需不需要处理。第二句话,你需要处理这种异常吗?这里是不是一定会发生异常?但是你需要处理吗?你需要,你需要在编写程序阶段处理吗?不需要啊,不需要100除以零,这是算术异常,叫做算术一。
23:01
算术异常啊,这个异常是运行时异常,运行时异常你。在编译阶段可以处理也可以不处理编译器。不管。明白吗?你可以处理,也可以不处理,你看没事啊,有同学老师我就要处理,我就要处理,那没问题,你可以处理TRY是不是,哎,K是一个什么异常,叫aas aasthatic exception,然后把这段代码拿到我们上面对吧?然后接下来在这里除异常,我们抛出一句话,对吧,叫什么呀,叫做算术异常了。可以呀,没问题啊。没问题啊,你愿意这么写,行可以,编译器不管,编译器就是不处理,编译器也不管,当然你处理也行,你处理也可以啊,这就是谁呀,叫做。
24:14
编译呃呃,这就是运行时异常的态度。运行时异常的态度是这样的,但如果你是编译时异常,你看看你这块,假如说你把它删掉,这立马就报错。对吧,为什么这个位置报错,是因为你调了这个方法,而这个方法这有可能会出现这个异常,而这个异常是一个负类是IOIO负类是exception,所以它是个编译是异常,你编译是异常必须对它进行处理,你在这里处理方式要么在这TRY开始捕捉,要么你可以把这个异常怎么着啊,继续往上抛,抛出去,当你抛出去之后,这个方法在执行过程当中就就有可能会出现这个异常,而这个异常是编译是异常,那么我在M2里边去调M3的时候,你看是不是也有两种处理方式,你要么在这,你如果不Rose,你看编译器是不是报错,你要么在这throw,诶要么在这干什么呀?诶TRY开始你选一个选一个啊选一个,那么这块呢,我们假如说如果又选择了我们ROS,那么这个时候谁去调我们M2,那么M2方法上是不是也有这么一个东西,就代表M1去调M2的时候,M2这块也也有可能会出现这个异常,那我这个异常就得在这处理一下,要么要么再拆开,你选一个,那么这个时候假如说的话再往上抛,抛给了文本方法,慢方法在这儿我们去调用me方法,你想想如果你不在。
25:28
点开吃。对吧,那么你就得在这。对不对,你没有在这throws那你是不是就在那TRY开始你总得选一个,你一个都不选,那你删掉这儿,你删掉这个,删掉这个,删掉这个妥了,你看看报错对吧?你要么在这throw,要么TRY开,如果我们这选择TRY开OK了,那就表示这个异常怎么着给捕捉了,给捕捉了各位啊,TRY开捕捉了,那这个其实就是刚刚我们刚才所说的这个,呃呃,这个在公司里边犯错是一样的,对吧?你比如说我犯错了对不对,我我我犯错了,导致公司损失一千万,那这个事儿太大呀,我捂不住啊,是不是我也解决不了,我只能上报啊,我处理不了啊对不对?行,那我上报,报给了谁?报给了我的领导,因为调我M3的,M2是领导,那么M2呢,他也没办法,只能把这个东西怎么着上抛对不对,哎,然后接下来呢,我们M2方法执行过程当中,如果真的也是出了异常,他也处理不了怎么办,他只能抛给M1。
26:23
M1这块继续往上抛,抛给谁啊,我们的问方法,问方法如果继续再往上抛,那只有一个什么意思啊,抛给了CEOCEO最后说,诶,公司的注册资本金才500万,你让我们损失了一千万,公司倒闭了啊,这就是Java虚拟机停止了,那如果说我们现在在这个位置上捕捉了是什么意思,就比示说诶,哎呀,那这咋办呀,是不是CE发货了,行吧,那也没办法,咱们公公司损失一千万,损失一千万吧,我把这钱补上去,咱们继续可以正常运转啊,正常运。对吧,就是这样。所以说异常这种东西,它和我们现实生活也是紧密相关的啊,它是一级往上抛,抛抛抛抛,对吧,直到有一级,它可以把这个异常处理掉啊,处理掉try catch是一种捕捉方式,在方法声明位置上,这属于上报方式,各位啊,就是总之我想告诉大家的是,处理异常有两种方式,你可以选择上报,你也可以选择捕捉啊,你也可以选择捕捉,上报和捕捉是两种方式啊,但这都是处理异常的方式。
27:23
都是处理方,但如果说你什么事你既不上报也不捕捉Java允许不允许,你好好看看,你既不在这儿上报,也不在这儿捕捉编译器是不是根本不让你过。所以你是不是就必须得写上它选一个,要么捕捉,要么上报?对吧,哎,要么捕捉,要么上报,你总是得写一个,你不写不行,不写一个不行,你得写一个。啊,但是前提是编译是异常,才需要这么做,大家看100除以零,这个运行是异常,算术异常是不是你在写程序的时候你不用管,当然你也可以管,你可以不管,没有任何问题,编译器没意见,这叫运行是异常,现在大家分清楚什么叫运行是异常,什么叫编译是异常了吗?哎,分清楚的话打个一,来各位来来这扣个一啊,扣个一各位啊。
28:17
来扣个一啊,扣个一各位就是说大家思考一下啊,思考一下啊。这块的东西啊,其实很有意思啊,很有意思就是说你你得选一个,要么上报,要么在这你捕捉你这两个,你得选一个,总之你得摆出你的处理态度,运行是异常你是不用管的啊,不用管的。
我来说两句