`

java方法重写时的异常限制

    博客分类:
  • java
 
阅读更多

1. 子类在重写父类的具有异常声明的方法时,要么不抛异常,要么就抛出跟父类方法相同的异常或该异常的子类。

2. 子类在重写父类的具有异常声明的方法的同时,又去实现了具有相同方法名称的接口且该接口中的方法也具有异常声明,则子类中的重写的方法,要么不抛出异常,要么抛出父类中方法声明异常与接口中方法声明的异常的交集。例子如下:

class Test
{
    public Test() throws IOException
    {}
    void test() throws IOException
    {}
}

interface I1{
    void test() throw Exception;
}

class SubTest extends Test implements I1
{
    public SubTest() throws Exception,NullPointerException, NoSuchMethodException
    {}
    void test() throws IOException
   {}
}

 在SubTest类中,test方法要么不抛出异常,要么抛出IOException或其子类比如:InterruptedIOException。

为什么这样设计呢?本人的理解是,当用子类去替换父类或者接口的类型,

1)当子类的方法不抛出异常时,针对原父类或接口的方法的异常处理程序虽然不起作用了,但还是可以留在原处的,不伤大雅。

2)当子类的方法抛出异常时,由于抛出的异常只能是父类或接口中声明的异常或者异常的子类,因此针对原有的父类或接口中的方法的异常处理程序仍然是有用的,异常处理程序能够处理异常的子类。原因是子类就是父类,父类不一定是子类。

最后,还要提醒一点,子类构造器不能捕获基类构造器抛出的异常,只能在子类构造器中声明其会抛出基类构造器的异常或该异常的父类。如在SubTest的无参构造器中,必须声明抛出IOException或者IOException的父类。此外SubTest的无参构造器还可以声明抛出其他的异常如:NullPointerException。

分享到:
评论

相关推荐

    java面试题

    子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是...

    java 面试题 总结

    子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    由于对构造方法可以进行重写 ,所以通过给出不同个数或类型的参数会分别调用不同的构造方法。 例子:以类 Rectangle 为例,我们生成类 Rectangle 的对象: Rectangle p1=new Rectangle (); Rectangle p2=new Rectangle...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    Java面试宝典2020修订版V1.0.1.doc

    25、JAVA中Object类中有哪些常用方法? 19 26、heap和stack有什么区别。 19 27、GC是什么? 为什么要有GC? 20 28、什么是内部类?分为哪几种? 20 29、为什么需要内部类? 20 30、内部类可以引用它的包含类的成员吗?...

    计算机(专升本)Java程序设计复习资料.doc

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后 者实现的是运行时的多态性。 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不 同或者二者都不同)...

    涵盖了90%以上的面试题

    Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) ...

    java经典面试2010集锦100题(不看你后悔)

    D) 类实现了接口,实现接口中的方法时可以重写该方法的访问权限,但是无法改变接口中变量的值。 题目20:b 下面关于接口和抽象类的说法中正确的是: A) 抽象类使类与类之间依旧具有父子联系,而接口一般只是定义了...

    程序员考试刷题-java8_ocp_study:java8_ocp_study

    方法不能限制更多的访问,但可以更改为更广泛的访问修饰符(如果父 --> 保护然后子 --> 不允许私有)(如果父 --> 保护然后子 --> 允许公共)。 方法不得抛出新的或更广泛的异常,但可以删除(如果父级 ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】运行时异常和非运行时异常 参见 21 运行时异常 21 非运行时异常 22 【基础】java引用类型 23 强引用(StrongReference) 23 软引用(SoftReference) 23 弱引用(WeakReference) 23 虚引用...

    突破程序员基本功的16课.part2

    2.2.3 调用被子类重写的方法 2.3 父子实例的内存控制 2.3.1 继承成员变量和继承方法的区别 2.3.2 内存中子类实例 2.3.3 父、子类的类变量 2.4 final修饰符 2.4.1 final修饰的变量 2.4.2 执行"宏替换"的变量 ...

    javaSE代码实例

    11.3.4 方法重写对抛出异常声明的约束 210 11.4 定义自己的异常 212 11.4.1 创建自己的异常类 212 11.4.2 使用自定义的异常类 213 11.4.3 显性再抛出作用的体现 215 11.5 异常的匹配 217 11.5.1 同时...

    【05-面向对象(下)】

    •在定义接口时,接口里可以包含成员变量(只能是常量),方法(只能是抽象实例方法、类方法或默认方法),内 部类(包括内部接口、枚举类  –常量都是:public static final修饰  –方法都是:public abstract ...

    java线程池概念.txt

    但是如果调用了allowCoreThreadTimeOut(boolean)方法并设置了参数为true,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的阻塞队列大小为0;(这部分通过查看...

    Java学习笔记-个人整理的

    {2.2.2}方法重写/覆盖}{50}{subsection.2.2.2} {2.3}修饰符}{51}{section.2.3} {2.4}父类对象的方法调用}{51}{section.2.4} {2.5}封装}{52}{section.2.5} {2.6}多态}{53}{section.2.6} {2.7}Sample code}{54}...

    C++编程思想 (作者学习C++亲身体会及多年教学经验)

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、...多态和虚函数、模板和包容器类、多重继承、异常处理和运行时类型识别...

    net学习笔记及其他代码应用

    29.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。 public void test(int i) { lock(this) { if (i>10) { i--; test(i); } } } 答:不会发生死锁,(但...

    C++编程思想1-5 清晰PDF

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、...多态和虚函数、模板和包容器类、多重继承、异常处理和运行时类型识别...

Global site tag (gtag.js) - Google Analytics