异常的抛出以及子父类异常处理的关系 在黑马三期基础阶段的学习已经结束了。告别轻松的第一阶段和可敬可爱的博哥,我们就要开始HTML的学习。在这之前,回顾下基础阶段两个月的学习,把自己感到困惑的知识点做一下提取写出来。这里概要的说一下异常的概念和异常的体系结构和分类,以及子父类异常之间的关系。 Java代码在编译和运行时出现的错误信息就是异常。Java中将异常信息封装成一个类,当出现相关错误信息时就创建异常对象并抛出异常相关信息。异常信息包括异常的类型、原因、位置。 查阅Java的JDK API(application programming interface),可找到所有异常的超类Throwable: 它有两个直接子类:Error和Exception。 Error类是不可以处理的异常的超类,不可以被捕获,抛出。一般是和jvm相关的,比如,系统,jvm,内存空间不足。 Exception类是可以处理的异常的超类, 要特别说明的是Exception 的一个子类RuntimeException,他和它的子类只在运行时期出现。即运行期间异常。比如Nullpointer空指针异常,数组越界异常。 由此还可以分类编译时期异常,它是Exception的子类,非RuntimeException的子类。比如IOException,ClassNotFoundException,SQLException,数据库访问失败或者相关错误信息的异常。 异常处理的情况有很多,比如在使用Try Catch语句处理多个异常时,假设有子父类关系的两个异常类:FileNotFoundException 和IOException;由API文档可知FileNotFoundException是IOException的直接子类。 这时候如果我先尝试捕获IOException,则会出现这样的错误: 点击红色叉号提示: 提示:Unreachable catch block for FileNotFouondException.It is alreadyhandled by the catch block for IOException. 意为:FileNotFoundException所在的Catch语句是运行不到的。它已经被IOException所在的Catch语句处理。 即:所有的异常都被父类异常捕获,后面捕获FileNotFoundException的尝试就会被彻底“屏蔽”。永远不会被触发。 发生这种情况,是由Java的“异常匹配”机制决定的。异常匹配就是指,抛出的异常到底由哪个异常处理单元(handler)处理。主要有两大原则: 1.就近匹配原则:找到离异常抛出点最近的处理单元,叫做“捕获”,然后就不再往下找。 2.向上转型原则:一个特定类型的异常处理单元,可以捕获它本身以及所有继承它的异常即它的子类异常。 所以根据以上两个原则,new FileReader()时抛出FileNotFoundException异常,根据就近原则找到最近的catch(IOException ie)处理单元,再根据向上转型原则,IOException处理单元可以处理他的子类异常FileNotFoundException,于是这个异常就被捕获处理了,不再继续往下寻找异常处理单元。catch(FileNotFoundException)处理单元永远运行不到,也就没有存在的意义。 这样我们再遇到TryCatch语句捕获多个异常时就能更透彻的理解子父类异常处理单元间的关系以及为什么父类异常要放在下面了。 新的阶段已经来临,没有理由停滞不前。感谢阅读。 |