我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Java》,我才明白其中的道理,现在我再来温习一下。

一、子类方法只能抛出父类方法的异常或者是其子异常

  对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常

package thinkinginjava;

public abstract class InningDemo1 {
public void walk() throws BaseException{}
public abstract void sing() throws BaseException;
} class BaseException extends Exception{}
class SubException1 extends BaseException{}
class CupException extends Exception{}
package thinkinginjava;

public interface OtherFunction {
public void task() throws RuntimeException;
} 
package thinkinginjava;

public class SubInningDemo1 extends InningDemo1 implements OtherFunction{
//子类方法可以抛出父类方法的异常
@Override
public void walk() throws BaseException{} //但不能抛出父类中没有的异常,否则编译会出错
//public void walk() throws Exception{} //子类方法可以抛出父类方法的子异常
@Override
public void sing() throws SubException1{} //当实现的接口和父类中的方法都有异常时,可以选择不抛出异常
public void task(){} }

  就拿这个例子来说,假如子类中有这方法 public void walk() throws CupException{},抛出了父类方法没有的异常,我们使用父类的引用指向子类

  public void f(){

    InningDemo1 inn = new SubInningDemo1();

    inn.walk() ;//父类调用walk()方法时,并不知道它会抛出CupException,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。

  }

  从上面的例子中,我们也可以看到,子类方法可以不抛出异常

二、子类构造器必须要抛出父类构造器的异常或者其父异常

  这是因为子类构造器中默认添加了父类的构造器

package thinkinginjava;

public abstract class InningDemo2 {
public InningDemo2() throws SubException{ }
} class FatherException extends Exception{}
class SubException extends FatherException{}
class PenException extends Exception{}
package thinkinginjava;

public class SubInningDemo2 extends InningDemo2{
public SubInningDemo2() throws FatherException {
//子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常
//super();
}
}

三、异常丢失

1、在finally中抛出异常,可能会之前抛出的异常丢失

package thinkinginjava;

public class FinallyException {
public static void main(String[] args){
try{
try{
throw new RedException();
}finally{
//把上一个异常覆盖掉
throw new BlueException();
}
}catch(Exception e){
System.out.println(e);
}
}
} class RedException extends Exception{}
class BlueException extends Exception{}

运行结果:thinkinginjava.BlueException

2、在finally中使用return,不会抛出异常

package thinkinginjava;

public class ReturnException {
public static void main(String[] args){
try{
throw new Exception();
}finally{
return;
}
}
}

以上代码我们看到它抛出了异常,但运行时不会有任何输出

java异常处理(父子异常的处理)的更多相关文章

  1. 每日一题:Java异常处理

    什么是异常 在理想情况下,程序总会运行在很完美的环境中,网络不会终端,文件一定存在,程序不会有 BUG.但是,理想很丰满,现实很骨干,实际生产环境中,网络可能会中断,文件可能会找不到,内存可能会溢出, ...

  2. java涉及父子类的异常

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

  3. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  4. 点评阿里JAVA手册之异常日志(异常处理 日志规约 )

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...

  5. java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类

    package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...

  6. 根据异常自定义处理逻辑(【附】java异常处理规范)

    ▄︻┻┳═一『异常捕获系列』Agenda: ▄︻┻┳═一有关于异常捕获点滴,plus我也揭揭java的短 ▄︻┻┳═一根据异常自定义处理逻辑([附]java异常处理规范) ▄︻┻┳═一利用自定义异常来 ...

  7. Java异常处理机制及两种异常的区别

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.   try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...

  8. Java中的异常和处理详解

    简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. ...

  9. [ Java学习基础 ] Java异常处理

    一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Sys ...

随机推荐

  1. 彻底搞懂Javascript的“==”

    本文转载自:@manxisuo的<通过一张简单的图,让你彻底地.永久地搞懂JS的==运算>. 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容让人犯错,从而 ...

  2. centos 6.5 升级php

    1>追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-re ...

  3. centos6.3与jexus5.4.4配置支持php(wordpress)

    centos6.3与jexus5.4.4配置支持php,并搭建自己的wordpress博客,供那些在Linux平台下想让 php和asp.net一起跑的初学者参考. 1.搭建webserver 首先准 ...

  4. ztreeDeptSelect 基于jquery和ztree的部门选择插件

    插件介绍 首先我们来看插件的功能演示(效果): 插件准备好后.前台只需编写html: <input type="text" class="deptName" ...

  5. CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能

    CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...

  6. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  7. JDBC基础

    今天看了看JDBC(Java DataBase Connectivity)总结一下 关于JDBC 加载JDBC驱动 建立数据库连接 创建一个Statement或者PreparedStatement 获 ...

  8. [转]Fiddler抓取Android真机上的HTTPS包

    此篇文章转载自:http://blog.csdn.net/roland_sun/article/details/30078353 工作中经常会需要对一些app进行抓包, 但是每次默认都是只抓http请 ...

  9. Maven(一)环境搭建

    网上已经有很多Maven学习的笔记和文章了,但是不自己亲自玩一玩,踩踩坑,证明不了自己到底能不能搞定它! 今天自己亲自搭建了一下环境,感觉基本的使用应该是可以满足了. 使用背景: 安装环境:Windo ...

  10. .Net使用RabbitMQ详解

    序言 这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其中,就把他抛开,我们只谈消息Rabbi ...