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笔记,如果有不对的地方,还望指正^_^

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

  1. JAVA项目中常用的异常知识点总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  2. java电商项目常见异常

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  3. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...

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

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

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

    java   虚方法.     后面new  那个类, 就调用哪个类的方法 ,而非定义类的方案.  关于父子 类的   呵呵 在多态的情况下,声明为父类类型的引用变量只能调用父类中的方法,但如果此变量 ...

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

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  7. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  8. JAVA之File类创建对象构造函数传参数需要注意的几点

    java中File类用于创建一个文件对象. 首先看一段代码: 1. package MyText1; import java.io.File; public class MyText1 { publi ...

  9. JAVA开发中遇到的异常总结

    最常见的五种异常:必会,面试题: 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数 ...

随机推荐

  1. Programming Python 3rd Edition 第三版 pdf chm下载

    Programming Python 作为一款经典系列书籍 非常的耐看 建议有志于学习python的童鞋好好看看 网上 Programming Python第四版的 pdf 下载非常容易 也就是最新的 ...

  2. unittest断言方法的使用

    unittest框架的TestCase类提供以下方法用于测试结果的判断 方法 检查 版本 assertEqual(a, b) a ==b   assertNotEqual(a, b) a !=b   ...

  3. BZOJ 4568 [Scoi2016]幸运数字 ——线性基 倍增

    [题目分析] 考虑异或的最大值,维护线性基就可以了. 但是有多次的询问,树剖或者倍增都可以. 想了想树剖动辄数百行的代码. 算了,我还是写倍增吧. 注:被位运算和大于号的优先级坑了一次,QaQ [代码 ...

  4. BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】

    题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式 输出文件中包含一行10个整数, ...

  5. robotframework使用

    下面是ui自动化的使用,关于接口自动化的使用参照此博客:http://blog.csdn.net/wuxiaobingandbob/article/details/50747125 1.使用pytho ...

  6. javaweb学习总结(八)——HttpServletResponse对象(二)(转)

    (每天都会更新至少一篇以上,有兴趣的可以关注)转载自孤傲苍狼 一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedI ...

  7. GDOI2018 新的征程

    看标题您一定以为考得很好.. Bad ending.想看美好结局的出门右转其他大佬博客. Day0 早上去车站的时候心情挺好.倒不是因为自己做足了准备,也不是因为预感到有好事发生,而是心情不好也没有用 ...

  8. 【C++】DLL内共享数据区在进程间共享数据(重要)

    因项目需要,需要在DLL中共享数据,即DLL中某一变量只执行一次,在运行DLL中其他函数时该变量值不改变:刚开始想法理解错误,搜到了DLL进程间共享数据段,后面发现直接在DLL中定义全局变量就行,当时 ...

  9. iOS 设置RGB色的宏

    转自:http://lizhuang.iteye.com/blog/1931768 
//RGB Color macro #define UIColorFromRGB(rgbValue) [UICol ...

  10. 487. Max Consecutive Ones II

    Given a binary array, find the maximum number of consecutive 1s in this array if you can flip at mos ...