Exception在方法继承中的限制

问题:

父类或接口中定义了方法应该抛出的异常,那么当子类重写方法时应该怎样定义将要抛出的异常:

首先定义异常和父类:

1 class Exception1 extends Exception {}
2 class Exception2 extends Exception {}
3 class Exception3 extends Exception {}
4 class Exception1_1 extends Exception1 {}
5 class Exception2_1 extends Exception2 {}
6 class Exception3_1 extends Exception3 {}
7 class SuperClass {
8     public void method1() throws Exception1 , Exception2 , Exception3 {}
9 }

正确的方法覆盖:

1. 子类方法只能抛出父类异常的子集合:

1 public class TestExceptionLimit extends SuperClass {
2     @Override
3     public void method1() {}
4 }
public class TestExceptionLimit extends SuperClass {
    @Override
    public void method1() throws Exception1 {}
}
1 public class TestExceptionLimit extends SuperClass {
2     @Override
3     public void method1() throws Exception1 , Exception2 , Exception3 {}
4 }

上面三种都可以。

2. 子类可以抛出父类异常的导出类:

1 public class TestExceptionLimit extends SuperClass {
2     @Override
3     public void method1() throws Exception1_1 , Exception2_1 {}
4 }

3. 还有一种特殊的情形,当子类同时继承一个父类和实现一个接口,而且这个父类和接口同时定义了签名一样的方法,但是抛出异常不一样,那么子类应该怎样定义自己的方法异常:

新的代码:

1 class Exception4 extends Exception {}
2 class Exception5 extends Exception {}
3
4 class SuperClass {
5     public void method1() throws Exception4{}
6 }
7 interface TestInterface {
8     public void method1() throws Exception5 ;
9 }

正确的覆盖:

1 public class TestExceptionLimit extends SuperClass implements TestInterface {
2     @Override
3     public void method1(){}
4 }

注意:不要抛出任何异常,下面可以证明:

1 public class TestExceptionLimit extends SuperClass implements TestInterface {
2     @Override
3     public void method1() throws Exception4 {}
4 }

这段代码编码会出错,错误信息为:Exception Exception4 is not compatible with throws clause in TestInterface.method1()。表示和接口定义的异常不匹配,如果你尝试抛出Exception5它又会告诉你和父类定义的异常不匹配,所以不写还不行嘛--!,Java设计者们还是挺人性化的~~~

时间: 2024-08-05 16:51:20

Exception在方法继承中的限制的相关文章

在继承中重写方法时抛出异常的问题

要清楚的知道子类重写父类的方法时,当父类抛出异常时,子类抛出的异常需要怎么写,首先必须了解异常的类型. Exception 这种异常分两大类运行时异常和非运行时异常(编译异常). 运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常).IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理.这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类

面向对象语言成员变量方法可见性在继承中的变化

最近做得的有点杂,接触到几种面向对象的语言,C#,C++,JAVA .在一个情景下,软件的框架已经写好了,我们要对其功能实现增加和修改,这种情况是经常发生的,那么在面向对象的程序设计中我们要怎么做呢.我们都知道面向对象语言有几个特点,多态,封装,继承,既然框架已经写好了,我们修改功能可以考虑用继承的方法去实现新的功能,那么这样做对原有的功能会有影响么?这就涉及到成员变量成员方法可见性在继承中的变化了. 首先,我们看C++ 派生类通过继承,将基类的成员作为自己的一部分,但不同的继承方式导致基类的成

[Java] 继承中,父类被覆盖的成员变量、方法的可访问性

在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. 例子: Super, 父类,拥有一个成员变量 x ,和成员方法 doSomething(). Point,继承 Super, 但覆盖了 Super 的 x 和 doSomething(),拥有自己的同名成员成员 x 和 doSomething(). StaticDemo1, 演示在继承中,在内部,可

201671010145 2016-2017 《Java程序设计》java的继承中什么叫方法覆盖,是如何实现的?

方法覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用.最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而在实现时,就需要实现接口声明的所有方法.除了这个典型的用法以外,在继承中也可能会在子类覆盖父类中的方法.在覆盖要注意以下的几点:1.覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果:2.覆盖的方法的返回值必须和被覆盖的方法的返回一致:3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类:4.被覆盖的方法不

5.Java继承中方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public class D

oc38--类工厂方法在继承中

// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int age; /* 什么是类工厂方法: 用于快速创建对象的类方法, 我们称之为类工厂方法 类工厂方法中主要用于 给对象分配存储空间和初始化这块存储空间 规范: 1.一定是类方法 + 2.方法名称以类的名称开头, 首字母小写 3.一定有返回值, 返回值是id/instancetype */ + (instancetype)p

四. Java继承和多态3. 继承中的方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public class D

day4(继承、修饰符、方法的重写、super关键词、继承中的构造方法、object类、对象转型)

1.类的继承(extends)通过继承,子类自动拥有父类的所有成员(成员变量和成员发方法)一个子类只能有一个父类,一个父类可以派生多个子类 2.访问修饰符(private 默认 protected public )对于class的权限修饰只可以用public和defaultdefault只能被同一个包内部的类访问 3.方法的重写(override)在子类中可以根据需要对从父类中继承来的方法进行重写重写方法必须和被重写方法具有相同方法名称.参数列表和返回类型重写方法不能使用比被重写方法更严格的访问

[转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但能否导出类应该也不是必须用MFC才能够做到,一定是有相应的机制可以实现.于是查了一下MSDN,发现这个机制简单的可怕,原来就和导出函数一样,把dllexport关键字加到类名前就可以了.估计和我一样的同学大有人在,把MSDN的相关文档翻译出来,附上我的注解,希望对大家有用. 评注程序均在Visual S