我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Java》,我才明白其中的道理,现在我再来温习一下。
一、子类方法只能抛出父类方法的异常或者是其子异常
对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常
package thinkinginjava; public abstract class InningDemo1 { public void walk() throws BaseException{} public abstract void sing() throws BaseException; } class BaseException extends Exception{} class SubException1 extends BaseException{} class CupException extends Exception{}
package thinkinginjava; public interface OtherFunction { public void task() throws RuntimeException; }
package thinkinginjava; public class SubInningDemo1 extends InningDemo1 implements OtherFunction{ //子类方法可以抛出父类方法的异常 @Override public void walk() throws BaseException{} //但不能抛出父类中没有的异常,否则编译会出错 //public void walk() throws Exception{} //子类方法可以抛出父类方法的子异常 @Override public void sing() throws SubException1{} //当实现的接口和父类中的方法都有异常时,可以选择不抛出异常 public void task(){} }
就拿这个例子来说,假如子类中有这方法 public void walk() throws CupException{},抛出了父类方法没有的异常,我们使用父类的引用指向子类
public void f(){ InningDemo1 inn = new SubInningDemo1(); inn.walk() ;//父类调用walk()方法时,并不知道它会抛出CupException,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。 }
从上面的例子中,我们也可以看到,子类方法可以不抛出异常
二、子类构造器必须要抛出父类构造器的异常或者其父异常
这是因为子类构造器中默认添加了父类的构造器
package thinkinginjava; public abstract class InningDemo2 { public InningDemo2() throws SubException{ } } class FatherException extends Exception{} class SubException extends FatherException{} class PenException extends Exception{}
package thinkinginjava; public class SubInningDemo2 extends InningDemo2{ public SubInningDemo2() throws FatherException { //子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常 //super(); } }
三、异常丢失
1、在finally中抛出异常,可能会之前抛出的异常丢失
package thinkinginjava; public class FinallyException { public static void main(String[] args){ try{ try{ throw new RedException(); }finally{ //把上一个异常覆盖掉 throw new BlueException(); } }catch(Exception e){ System.out.println(e); } } } class RedException extends Exception{} class BlueException extends Exception{}
运行结果:thinkinginjava.BlueException
2、在finally中使用return,不会抛出异常
package thinkinginjava; public class ReturnException { public static void main(String[] args){ try{ throw new Exception(); }finally{ return; } } }
以上代码我们看到它抛出了异常,但运行时不会有任何输出
以上这篇浅谈java异常处理(父子异常的处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍浅谈java异常处理之空指针异常,包括了浅谈java异常处理之空指针异常的使用技巧和注意事项,需要的朋友参考一下 听老师说,在以后的学习中大部分的异常都是空指针异常。所以抽点打游戏的时间来查询一下什么是空指针异常 一:空指针异常产生的主要原因如下: (1)当一个对象不存在时又调用其方法会产生异常obj.method() // obj对象不存在 (2)当访问或修改一个对象不存在的字段时
本文向大家介绍浅谈JavaScript异常处理语句,包括了浅谈JavaScript异常处理语句的使用技巧和注意事项,需要的朋友参考一下 程序运行过程中难免会出错,出错后的运行结果往往是不正确的,因此运行时出错的程序通常被强制中止。运行时的错误统称为异常,为了能在错误发生时得到一个处理的机会,JavaScript提供了异常处理语句。包含try-catch、try-catch-finally和thro
本文向大家介绍浅谈PHP中的错误处理和异常处理,包括了浅谈PHP中的错误处理和异常处理的使用技巧和注意事项,需要的朋友参考一下 错误处理: 1. 语法错误 2. 运行时的错误 3. 逻辑错误 错误报告: 错误E_ERROR 警告E_WARNING 注意E_NOTICE 开发阶段:开发时输出所有的
本文向大家介绍详谈.NET的异常处理,包括了详谈.NET的异常处理的使用技巧和注意事项,需要的朋友参考一下 年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的看着大佬们发表心情。 以上的废话说的够多了,这里就不再废话了,还是切入正题吧。 在项目开发中
主要内容:异常简介,异常类型很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。 计算机程序的编写也需要考虑处理这些异常情况。 异常(exception)是在运行程序时产生的一种异
我期望第1行捕获从第0行抛出的NullPointerException,但它没有发生。 但为什么呢?。 当定义了另一个catch块时,为什么第1行的NPE处理程序不能捕获它? 是因为“投掷”直接进入main()方法吗?