`

异常的限制,异常说明在类继承是怎样的?

阅读更多
package com.lwf.thinking.eight;
class BaseBallException extends Exception{}
class Foul extends BaseBallException{}
class Strike extends BaseBallException{}
abstract class Inning{
	public Inning() throws BaseBallException{}
		//注意构造方法抛出了异常。
	public void event() throws BaseBallException{
		//这里并没有显式throw new BaseBallException();
	}	
	public  abstract void getName() throws Foul,Strike;
	
	public  void getAge(){}
}

class StormException extends Exception{}
class RainedOut extends StormException{}
class PopFoul extends Foul{}
interface Storm{
	public void event() throws RainedOut;
	public void rainHard() throws RainedOut;
}
public class UserDefineException extends Inning implements Storm{
	public UserDefineException() throws BaseBallException,RainedOut{
		//1、因为基类的构造方法抛出了异常,根据继承机制,实例化该类必然调用基类实例化,所以该类的构造方法必须显式抛出异常
		//2、派生类的构造方法可以抛出基类所没有抛出的异常如RainedOut,注意这一点非构造方法不行。
		
	}
	public UserDefineException(String s) throws BaseBallException,PopFoul{}//只要抛出类型包含了BaseBallException即可,类国基类只抛出此类型
	
//	public void getName() throws Foul, Strike{}
		//3、派生类抛出与基类所抛出的对应异常。
//	public void getName() throws Foul{}
//	public void getName() throws Strike{}
		//4、仅抛出与基类该方法抛出异常中的任意一个
	public void getName() throws PopFoul{	}
		//5、上例中抛出了从Foul继承而来的PopFoul异常
	//	public void getName(){}
		//6、不抛出任何对应异常
//	public void getName() throws BaseBallException{}
		//7、compile error,抛出了不与基类对应的抛出异常,注意这里BaseBallException是Strike和Foul的父类也是不行的。
	
	public void event(){}
	//如果这里没有event方法,程序将报错:意思是抽象类与接口所抛出的异常不兼容。
	//注意两个基类抛出了不同的异常:这时即使用public void event() throws BaseBallException, RainedOut{}也是不行的。
	public void rainHard() throws RainedOut{}
	
	public static void main(String[] args){
		try {
			UserDefineException u = new UserDefineException();
			u.getName();
		} catch (PopFoul e){
			System.out.println("PopFoul");
		} catch (RainedOut e) {
			System.out.println("RainedOut");
		} catch (BaseBallException e) {
			System.out.println("BaseBallException");
		}
		try {
			Inning i = new UserDefineException();
			i.getName();
			//向上转型才要求捕获基类所抛出异常,如果不进行向上转型是可以不要求捕获的。
		} catch (RainedOut e) {
			System.out.println("RainedOut");
			
		} catch (Foul e) {
			System.out.println("BaseBallException");
		} catch (Strike e) {
			e.printStackTrace();
		} catch (BaseBallException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
	}
}
/*
 * 总结一下关于异常的限制:
 * 对构造方法:基类构造方法抛出异常,派生类构造方法必须显式抛出对应异常(如上例第1点),且可以抛出其它异常,(如上例第2点)
 * 	实质上来说异常限制对构造器不起作用,即构造器可抛出任何异常,但因为派生类构造器不能捕获基类构造器抛出的异常,所以派生类所抛出异常中必须要包含基类所抛出的异常。
 * 对普通方法:基类普通方法抛出异常,派生类普通方法可抛出对应异常(如上例第3点)、可少抛出异常(如上例第4点)、
 * 			      可抛出对应基类异常的继承异常子类(如上例第5点)、也可不抛出异常(如上例第6点),但不能抛出与基类不对应的异常(如上例第7点)
 * 特殊情况:上例中的event方法,因为基类和接口都有event方法,并且抛出的异常类型又不相同,那么注意的是派生这里只有选择不抛出异常,因为
 * 			   不管抛出哪一个或是抛出两个都是不行的。
 * 
 * 异常说明:
 * 			异常说明本身并不属于方法原型的一部分,所以不能根据异常说明的不同来重载方法。
 * 			一个出现在基类异常说明中的异常,不一定会出现在派生类的异常说明中。这点与继承的规则是不同的。
 * 
 */ 
 
分享到:
评论

相关推荐

    JAVA实验十一 异常处理与集合类

    在Java中,异常类可以作为方法的声明部分,表明该方法可能抛出某种类型的异常。这使得调用者必须处理这些异常,或者将异常传播给上层调用者。在`SavingsAccount`和`CheckingAccount`的`withdraw`方法中,异常通过`...

    Java 类和继承相关代码集

    - 异常是类,可以通过`throw`语句抛出,也可以使用`throws`声明方法可能抛出的异常。 9. **构造器链**: - 当子类创建一个新对象时,会先调用父类的构造器,然后执行子类自己的构造逻辑。这就是构造器链。 在这...

    Java\课件\JAVA的异常处理机制.ppt

    Java的异常类基于继承体系,主要分为两大类: - **Exception**:这是所有检查性异常的基类,包括运行时异常(RuntimeException及其子类)和其他非运行时异常。例如`IOException`、`NoSuchMethodException`等。 - ...

    c++异常处理

    程序员可以通过继承这些类创建自定义异常。 - 构造和析构过程中的异常处理非常重要,因为如果在这些过程中抛出异常,确保对象的正确销毁以避免资源泄漏。 - 异常规格(Exception Specifications)如`noexcept`,...

    java异常ppt

    预定义异常如IOException、NullPointerException等,自定义异常则是程序员根据需要创建的新异常类,通常继承自Exception或其子类。 结构化的异常处理有三种基本形式: 1. `try-catch-finally`:当需要捕获异常并...

    Java语言程序设计:第五章 异常.ppt

    所有的异常类都是Throwable的子类,所以它们都继承了Throwable的这些方法。 三、异常的产生 异常可以通过抛出异常对象来产生。例如,在数组越界的情况下,Java虚拟机(JVM)将抛出一个...

    java异常汇总.txt

    这通常发生在类继承结构发生变化后。 #### 21. InstantiationError - 实例化错误 当无法实例化一个类时,会抛出`InstantiationError`。这可能由抽象类或接口的实例化尝试、类加载问题或其他错误引起。 #### 22. ...

    java包接口异常处理实验

    - 可以通过继承`Exception`类或其子类来创建自定义异常类。 - 自定义异常类通常用于表示应用程序特有的错误情况。 2. **异常处理与对话框结合**: - 使用`JOptionPane`类可以创建简单的对话框,用于提示用户信息...

    钱能c++教程 异常

    5. **异常继承体系**:异常类可以构成继承体系,允许自定义异常类继承自标准异常类或其他自定义异常类,提供更具体的错误信息。 6. **非错误处理**:异常机制并不仅仅用于错误处理,也可以用于程序设计中的其他控制...

    完整版 Java初级教程 Java语言程序设计 第6章 内部类和异常类(共22页).ppt

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以提供更好的封装,使代码结构更加紧凑,并且能够直接访问外部类的私有成员,包括变量和方法。从Java 1.1开始引入,...

    Silverlight捕捉WCF异常

    在这个例子中,`MyCustomFault`是自定义的异常类,它继承自`FaultException`。当服务方法抛出这个类型的异常时,客户端可以捕获并处理`MyCustomFault`。 总结来说,处理Silverlight中的WCF异常涉及以下几个关键步骤...

    【09-异常处理】

    •throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗 号隔开。throws声明抛出的语法格式如下  –throws ExceptionClass1 , ExceptionClass2... 抛出异常 ...

    Python:通用异常类型表

    在Python编程语言中,异常处理是程序健壮性的重要组成部分。异常是程序运行时遇到的问题,它们可以打断正常的代码流程。Python提供了丰富的异常类型,这些异常被组织成一个层次结构,使得处理和捕获特定类型的错误...

    关于JAVA继承的讲解

    在Java中,一个重要的限制是单一继承,即一个子类只能有一个直接父类,但一个父类可以有多个子类。这与某些其他语言(如C++)的多重继承不同。然而,Java通过接口(Interface)支持多重继承的类似效果,一个类可以...

    C++Exception 异常处理 源码

    开发者可以创建自己的异常类,继承自`std::exception`或直接自定义,以便在特定情况下抛出更有意义的异常。 8. **异常传播**: 如果在`catch`块内部再次抛出异常,原始的异常会被丢弃,新的异常会替代它继续传播...

    java异常1[借鉴].pdf

    Java的异常继承自java.lang.Throwable类,包括Error和Exception两个主要子类。Error通常代表系统级错误,如JVM内部错误,程序一般不需要捕获这些错误。而Exception是程序需要处理的异常,可以被程序员通过try-catch...

    继承和多态笔记.docx

    - 控制访问权限,通过包访问权限来限制哪些类可以访问其他类。 - 避免名字冲突,即使不同包中的类名相同,也可以通过指定完整的包名来明确调用哪个类。 - **命名规则**: - 包名通常采用小写字母。 - 一般遵循`...

    Java异常应用指导.docx

    异常的继承结构在Java中是层次化的,从`Throwable`类开始,`Error`和`Exception`都继承`Throwable`。`Error`通常代表系统级别的错误,如JVM错误,这些错误通常无法通过程序处理,因此不应在代码中捕获或抛出`Error`...

    c++课件第九章继承共29页.pdf.zip

    异常处理在继承层次结构中也是有效的,派生类可以捕获基类抛出的异常。 通过这29页的C++课件,你将全面理解C++中的继承机制,并能熟练运用到实际编程中,提升你的编程能力。记住,掌握继承是迈进C++面向对象编程...

Global site tag (gtag.js) - Google Analytics