java涉及父子类的异常

java中的异常涉及到父子类的问题,可以归纳为一句话:子类的构造函数抛出的异常必须包含父类的异常,子类的方法可以选择抛出“范围小于等于”父类的异常或不抛出异常。

1. 为什么构造函数必须抛出包含父类的异常?

在《thingking in java》中有这么一段话:

异常限制:当覆盖方法时,只能抛出在基类方法的异常说明中列出的那些异常

异常限制对构造器不起作用,你会发现StormyInning的构造器可以抛出任何异常,而不必理会基类构造函数所抛出的异常。然而因为必须构造函数必须以这样或那样的方式被调用,子类构造函数的异常说明必须包含基类构造器的异常说明

这段话起初一开比较绕,但是嘻嘻看一遍就会明白:

首先,异常说明只针对覆盖方法,而构造函数明显不在这个范围,所以子类构造函数可以抛出任何异常,而不用顾及父类构造函数所抛出的异常。但是在new 一个子类对象的时候,父类构造函数一定会被调用,所以子类构造函数调用的对应的父类构造函数所抛出的异常就必须考虑在内,此时又因为“子类构造函数无法捕获父类构造函数所抛出的异常(后面会提)”,所以子类构造函数必须抛出这个异常。

class SomeException extends Exception{}

class TheOtherException extends Exception{}

class BaseC
{
	public BaseC()throws SomeException{}

	public BaseC(int a)throws TheOtherException{}
}

class SubC extends BaseC
{
	public SubC() throws SomeException //如果不抛出异常就会报错
	{
		super(); //由于调用的基类的默认构造函数, 所以要抛出SomeException
	  //super(37) ; //如果将super()替换成这里,就必须抛出TheOtherException
	}

}

2. 为什么子类构造函数无法捕获父类构造函数所抛出的异常?

因为子类如果想要捕获父类抛出的异常,就必须显示地调用super() ; 或者super(xxx...); 然而super()和this()这些都有一个特性, 就是必须将他们放在第一行, 这与try{}catch{}相矛盾, 所以无法捕获

3. 当子类继承的父类和接口存在相同的方法名时,这时的处理方式就必须遵循异常限制。

class SomeException extends Exception{}

class TheOtherException extends Exception{}

interface InterF
{
	public void function()throws TheOtherException;
}
class BaseC
{
	public void function()throws SomeException{}
}

class SubC extends BaseC implements InterF
{
	//此时只能选择不抛出异常
	public void function(){}

	//报错:Exception SomeException is not compatible with throws clause in InterF.function()
	//	public void function()throws SomeException{} ;
	//报错:Exception TheOtherException is not compatible with throws clause in BaseC.function()
	//  public void function()throws TheOtherException{} ;
}

4. 为什么子类只能抛出在基类方法的异常说明中列出的那些异常?

  因为子类存在向上转化成父类的可能性,如果允许子类随意抛出异常的话,那么向上转化成父类时,该方法的接口(姑且这么叫吧)会变成父类的方法类型,此时问题来了,子类会抛出异常,而父类却无法对该异常做出处理,所以为保证对象的可替换型,强制要求“只能抛出在基类方法的异常说明中列出的那些异常”。

  这里所说的“那些异常”还包括这些异常的子异常!

5. 这一点不知道算不算,也许是我比较愚钝吧,我在看的时候想了好久才明白过来,姑且记下来吧。

class SomeException extends Exception{}

class BaseC
{
	public void function()throws SomeException{}//如果这里抛出的异常是一个运行时异常子类就可以不对其进行异常处理
}

class SubC extends BaseC
{//这两个function()所进行的super.function()的都属于正常的函数调用,不属于异常处理的范围, 但是这个函数本身要符合异常处理的规范!
/*
	public void function()throws SomeException
	{
		super.function();
	}
*/
	public void function()
	{
		try
		{
			super.function() ;
		}
		catch(SomeException e)
		{
			e.printStackTrace();
		}
	}
}

  

//thinking in java笔记,如果有不对的地方,还望指正^_^

时间: 2024-10-07 22:27:17

java涉及父子类的异常的相关文章

JAVA之父子类的构造函数、静态代码块等执行顺序

欢迎转载,请附出处: http://blog.csdn.net/as02446418/article/details/47092769 最近在做项目时遇到了Java构造函数,代码块的一些执行顺序方面的知识,随兴做了个实验,毕竟实践出真知嘛.遇到的问题简单说一下就是在子类A继承父类B的时候,如果在代码中 A a = new A(); 这个时候父类和子类的静态代码块和构造函数执行的先后顺序到底是怎么样的呢? 我得出的结论是 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B

java电商项目常见异常

1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,

java 多态利弊 及 父子类转换条件

多态  父子类转换条件: Java中父类强制转换成子类的原则:父类型的引用指向的是哪个子类的实例,就能转换成哪个子类的引用. 多态的好处: 可以当做形式参数,可以接收任意子类对象. 多态的弊端: 不能使用子类的特有属性和行为.

【java&c++】父子类中同名函数的覆盖问题

java和c++两门语言对于父子类中同名函数具有不同的处理方式. 先上两段代码: C++: class Basic { public: void test(string i){ cout << "basic str" <<endl; } void test(int i){ cout << "basic" <<endl; } }; class Senior : public Basic { public: void te

java 虚方法。 后面new 那个类, 就调用哪个类的方法 ,而非定义类的方案。 关于父子 类的 呵呵

java   虚方法.     后面new  那个类, 就调用哪个类的方法 ,而非定义类的方案.  关于父子 类的   呵呵 在多态的情况下,声明为父类类型的引用变量只能调用父类中的方法,但如果此变量实际引用的是子类对象,而子类对象中覆盖了父类的方法,这时父类对象调用的是子类中的方法,这种机制就成为虚方法调用.所以,同样的两个引用变量调用相同的方法结果可能不同.

黑马程序员_Java异常 Java常用库类

Java异常 1,异常的基本概念 异常是导致程序中断运行的一种指令流,它是在运行时期发生的不正常的情况,在Java中,一切的异常都秉着面向对象的设计思想,所有的异常都是以对象和类的形式存在的. 2,异常类的继承结构 在整个Java的异常结构中,实际上有两个最常用的类,Exception和Error,这两个类分别是Throwable的子类 Exception:一般表示的是程序中出现的问题,可以直接使用try....catch处理 Error:一般之的是JVM的错误,程序中无法处理. 3,Java的

Java 读取I/O操作所涉及的类

一.首先看一下涉及I/O操作所涉及的类: 前两组主要是说明数据传输的格式,一个是字节,一个是字符. 后两组主要说明数据传输的方式. 1.1.1 下面是基于字节的I/O操作接口. InputStream 接口 Outputstream 接口 1.1.2 基于字符的I/O操作接口 writer 类 reader类 1.1.3 字符和字节转化接口 其中读的转化过程如下: 其中inputstreamreader是一个从字节到字符的转换桥梁,从inputstream 到reader 转换需要指定编码字符集

深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

周志明的<深入理解Java虚拟机>很好很强大,阅读起来颇有点费劲,尤其是当你跟随作者的思路一直探究下去,开始会让你弄不清方向,难免有些你说的啥子的感觉.但知识不得不学,于是天天看,反复看,就慢慢的理解了.我其实不想说这种硬磨的方法有多好,我甚至不推荐,我建议大家阅读这本书时,由浅入深,有舍有得,先从宏观去理解去阅读,再慢慢深入,有条不紊的看下去.具体来说,当你看书的某一部分时,先看这部分的章节名,了解这部分这一章在讲什么,然后再看某一章,我拿"类文件结构"这一章来说,我必须

JAVA开发中遇到的异常总结

最常见的五种异常:必会,面试题: 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException ====================================================