我当初学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. 续 CentOS7(mini) 运行MVC5 + Mariadb

    上一篇,介绍了在CentOS7上使用mono官方二进制安装包快速安装mono环境 并且成功运行了一个Owin自宿主应用(Booker) 由于Owin自宿主应用不需要System.Web的支持,所以可以 ...

  2. 冗余代码都走开——前端模块打包利器 Rollup.js 入门

    之前翻译过一篇文章,介绍了通过 ES2015 的解构赋值语法引入模块,可以让打包工具(browserify)最终编译出来的代码量最小化. 殊不知在 webpack 1.X 版本是无法利用该特性来避免引 ...

  3. 站在风口,你或许就是那年薪20w+的程序猿

    最近面试了一些人,也在群上跟一些群友聊起,发现现在的互联网真是热,一些工作才两三年的期望的薪资都是十几K的起,这真是让我们这些早几年就成为程序猿的情何以堪!正所谓是站在风口上,猪也能飞起来!我在这里就 ...

  4. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  5. Android之SQLite数据库篇

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...

  6. css中常见的属性-----在路上(14)

    一.css文字属性 color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-size : 9pt; /*文字大小*/ ...

  7. iOS 之UITextFiled/UITextView小结

    一:编辑被键盘遮挡的问题 参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)mov ...

  8. Nginx代理功能与负载均衡详解

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  9. HTML基础

    HTML指的是超文本标记语言 (Hyper Text Markup Language), HTML不是一种编程语言,而是一种标记语言 (markup language) ,HTML使用标记标签来描述网 ...

  10. EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题

    问题控件:datagrid.combobox.所有能设置url属性的控件 问题版本:1.4.4.1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候 ...