在继承中重写方法时抛出异常的问题

要清楚的知道子类重写父类的方法时,当父类抛出异常时,子类抛出的异常需要怎么写,首先必须了解异常的类型。

Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

我看到一篇博文这样说

1,子类重写父类方法要抛出与父类一致的异常,或者不抛出异常

2,子类重写父类方法所抛出的异常不能超过父类的范畴

先看例子1

public class TestRegularExperssion {
    public void printA(float a,float b)throws SQLException
    {

    }
}
class TestRegularExpressionA extends TestRegularExperssion
{
    public void printA(float a,float b)throws NullPointerException
    {

    }
}

例子1:父类抛出的是CheckedException,子类抛出的是RuntimeException,编译通过,看来第一条规则和第二条规则都不对。

例子2

public class TestRegularExperssion {
    public void printA(float a,float b)throws NullPointerException
    {

    }
}
class TestRegularExpressionA extends TestRegularExperssion
{
    public void printA(float a,float b)throws SQLException
    {

    }
}

例子二:将父类和子类抛出的异常类型换了              结果:编译不通过

经过试验我得到的规则是

如果是RuntimeException      Java编译器不会检查它,所以你在子类继承中使用它,父类都没有关系。

如果不是RuntimeException  子类不能抛出比父类范围更广的异常,子类抛出更明确的异常。

时间: 2024-10-11 15:39:04

在继承中重写方法时抛出异常的问题的相关文章

Java多态机制和继承中重写重载

关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()

SSH配置环境都正常,但是每次执行到Action中的方法时就中断了,而且不报任何错误

SSH配置环境都正常,但是每次执行到Action中的方法时就不执行课,而且不报任何错误.Action中的方法封装的是业务层,业务层封装DAO层,检查了一天才发现错误在哪. 在applicationContext.xml中报了一个异常,如: Multiple annotations found at this line: - Exception 'com/dao/StudentDAO : Unsupported major.minor version 51.0' - Exception 'com/

category中重写方法?

问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便的去拓展一个类,而不是去重写一个类. 理由: 1.category中重写了A类中的某个方法,那么A类中的原始方法 将永远不会被执行.特殊:load.initialize.viewDidLoad等方法 会先执行A类中的原始方法,再执行category中的方法. 2.多个category中有相同的方法

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo

四. Java继承和多态3. 继承中的方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public class D

组合与继承之重写方法和字段

接上篇blog,scala里的字段和方法属于相同的命名空间,这让字段可以重写无参数方法.例如,你可以通过改变ArrayElement类中contents的实现将其从一个方法变为一个字段,而无需修改类Element中contents的的抽象方法定义,如例: abstract class Elements {     def contents: Array[String]     val height = contents.length     val width = if(height == 0)

继承、重写方法-电子宠物系统

1 package com.szxs.pet; 2 /** 3 * 父类 :宠物类 4 * @author 5 * 6 */ 7 public class Pet { 8 private String name; // 宠物名字 9 private int health; // 宠物健康值 10 private int love; // 宠物亲密度 11 12 public String getName() { 13 return name; 14 } 15 16 public void set

1//继承和重写方法。。。。

1 package com.mingrisoft; 2 public class Employee { 3 4 5 private String name; 6 private double gongzi; 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 public double getGongzi