这里给一张它们两人的合照吧:
2.非常匹配
本日我们紧张任务便是教大家认识非常匹配。
什么叫“非常匹配”?

当非常被抛出时,非常处理系统会按照catch的书写顺序找出参数与非常类型相匹配的第一个处理程序(catch),然后进入catch子句实行,此时非常得到了处理,之后不再连续查找。
定义有点长这里给大家分词阐明+举例解释。
第一句:“当非常被抛出时”
从句子中可以看出须要抛出一个非常。
第二句:“非常处理系统会按照catch的书写顺序找出参数与非常类型相匹配的第一个处理程序(catch)”
此句子里面提到“找出参数与非常类型相匹配的第一个处理程序”,像此例中catch参数类型是IOException,try里面抛出的非常类型也是IOException,一看就相匹配。
这样就成功地完成了一次匹配。
那么不匹配的情形是什么样的呢?
便是抛出的非常类型和catch参数类型不一致。例如IOException和ClassNotFoundException就不匹配:
上面演示了一些单个catch的情形,如果多个catch的情形呢?从“非常处理系统会按照catch的书写顺序找出参数与非常类型相匹配的第一个处理程序(catch)”这句话我们也能感想熏染到有多个catch进行非常匹配的情形。下面举例解释。
上述程序抛出了两个非常IOException和ClassNotFoundException,我们对其分别进行catch操作。当发生非常时,非常处理系统就会按照catch的书写顺序(从上至下)开始查找相匹配的catch进行实行。
例如,当发生IOException时,实行第一个catch:
当发生ClassNotFoundException时,实行第二个catch:
第二句阐明完了,接着来看后面三句:“然后进入catch子句实行,此时非常得到了处理,之后不再连续查找。”
后面三句是说当我们非常被catch到往后,此非常就算是被处理了,当非常被处理完之后,非常处理系统就结束查找过程。
这个也很好理解,比如,我们程序发生IOException,匹配到第一个catch:
此时后面还有一个catch,它的参数类型是ClassNotFoundException,这个catch就不再连续匹配了,无论后面还有多少个catch都不再进行匹配了。
至此,非常匹配阐明完了,下面看看怎么利用一个catch捕获所有非常。
3.利用一个catch捕获所有非常怎么才能利用一个catch捕获所有非常呢?
利用所有非常的父类即可。
所有非常的父类是?
是Exception。
下面通过一个例子来演示一下如何利用catch捕获所有非常。
演示:
请利用一个catch捕获所有非常。
请不雅观察程序代码。
代码:
Main类:
结果:
从运行结果来看,程序写得没有问题,我们的确通过一个catch捕获了所有非常。
重点:
为什么一个catch可以捕获所有非常?
由于非常匹配时,不须要非常类型和catch参数类型完备同等,是catch参数类型的子类也可以匹配到。
简而言之便是,由于IOException和ClassNotFoundException正是Exception的子类,以是一个参数类型为Exception的catch子句就够了。
4.利用一个catch捕获多个非常接下来是教大家如何利用一个catch捕获多个非常。
多个非常?
嗯,便是同时在一个catch里面捕获两个及以上的非常。
那就演示一下吧。
演示:
请利用一个catch捕获多个非常。
请不雅观察程序代码。
代码:
Main类:
结果:
从运行结果来看,程序没有问题。
来看见地式代码是怎么写的,首先我们在try代码块里面抛出两个非常IOException和ClassNotFoundException:
由于if条件表达式的缘故,它们两个非常中间一定会抛出一个非常。而抛出它们两个中的任意一个,都会被我们catch捕获到。
为什么抛出它们两个非常中的任意一个都会被捕获到呢?
由于单个catch块可以处理多种类型的非常。此功能可以减少代码重复并减少捕获过于宽泛的非常。
在catch子句中,指定块可以处理的非常类型,并利用竖线(|)分隔每个非常类型。
这个竖线(|)便是或的意思。
上述例子中,catch中的参数类型表示我既能捕获IOException,也能捕获ClassNotFoundException。当try代码块里面发生这两个非常中的任意一个,我都能捕获到。
5.多个catch分别捕获非常这一小节是最随意马虎的,由于之前章节中多次涌现这种情形。下面我们就来看看,多个catch分别捕获非常的情形。
演示:
请利用多个catch分别捕获非常。
请不雅观察程序代码。
代码:
Main类:
结果:
从运行结果来看,程序写得没有问题,结果也符合预期。
看一下程序代码:
这里的话,我们抛出了两个非常IOException和ClassNotFoundException,然后呢,我们又利用两个catch分别去捕获IOException和ClassNotFoundException。
实际运行的时候,实行的是抛出IOException:
故实行结果便是:
程序就这么大略,实在分别来捕获非常这种写法在日常开拓中很常见,大家也会逐渐熟习起来。
接下来,又到了重点时候,请大家把稳。
6.多个catch时,父类非常放在末了【重点】本日的重中之重:
多个catch时,父类非常放在末了。
就两句话,第一句:多个catch时
前置条件是多个catch,一个catch此定义不存在的,一定假如多catch。
例如:
第二句:父类非常放在末了
像上图代码这样的弗成,为什么呢?
Exception是IOException和ClassNotFoundException的父类,怎么能放在它们的前面。
为什么不能放在它们前面?
由于父类非常会将后面的子类非常覆盖掉,普通来讲便是每次非常匹配的都是父类前辈行匹配,如果是子类非常的话,父类非常仍旧匹配成功,这样就没有后面子类非常什么事,以是子类非常写在父类非常没故意义。
结合例子来看,我们运行程序,看看实行结果:
缺点信息:
笔墨版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(21, 10) java: 已捕获到非常缺点java.io.IOException
Error:(23, 11) java: 已捕获到非常缺点java.lang.ClassNotFoundException
这里编译就直接不通过。以是希望大家千万要记住,不要将父类非常放在子类非常的前面。
总结当非常被抛出时,非常处理系统会按照catch的书写顺序找出参数与非常类型相匹配的第一个处理程序(catch),然后进入catch子句实行,此时非常得到了处理,之后不再连续查找。非常匹配时,不须要非常类型和catch参数类型完备同等,是catch参数类型的子类也可以匹配到。单个catch块可以处理多种类型的非常。此功能可以减少代码重复并减少捕获过于宽泛的非常。在catch子句中,指定块可以处理的非常类型,并利用竖线(|)分隔每个非常类型。多个catch时,父类非常放在末了。至此,Java中catch与非常匹配干系内容讲解先告一段落,更多内容请持续关注。
答疑如果大家有问题或想理解更多前沿技能,请不才方留言或评论,我会为大家解答。
上一章“全栈2019”Java非常第十一章:重写方法时只能抛出父类非常子集
下一章“全栈2019”Java非常第十三章:访问非常堆栈跟踪信息
学习小组加入同步学习小组,共同互换与进步。
办法一:关注头条号Gorhaf,私信“Java学习小组”。办法二:关注"大众年夜众号Gorhaf,回答“Java学习小组”。全栈工程师学习操持关注我们,加入“全栈工程师学习操持”。
版权声明
原创不易,未经许可不得转载!