`
yangyongxiang
  • 浏览: 697 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

涉及继承的异常声明及捕捉

阅读更多
当有继承发生时,会伴随着重载、覆写(包括接口方法的实现)、构造器的重写等行为。此时,如果基类或是接口的方法存在异常声明,那么导出类或是接口的实现类的对应方法该如何声明异常?同时对这些方法的调用该如何捕捉异常?下面就这2个问题进行探讨,你会看到,针对覆写和构造器的重写是2种完全不同的处理方式(针对重载则没有任何限制)。代码如下:

Java代码
1.//@file Example1.java  
2. 
3.class ExtException extends Exception {}  
4.class AnotherException extends Exception {}  
5. 
6.class Base  
7.{  
8.    public void func() {}  
9.      
10.    public void func2() throws Exception {}  
11.    public void func3() throws ExtException {}  
12.      
13.    public Base() throws Exception {}  
14.    public Base(int i) throws Exception {}  
15.    //public Base(float f) throws ExtException{} //Error No.5: every other constructor will call the default constructor; same as Error No.4  
16.}  
17. 
18.interface Inf  
19.{  
20.    public void func2() throws ExtException;  
21.    //public void func3() throws AnotherException; //Error No.3: base and interface conflicts  
22.      
23.    public void func4() throws Exception;  
24.    public void func5() throws Exception;  
25.}  
26. 
27.class ExtImp extends Base implements Inf  
28.{  
29.    //public void func()  throws ExtException{} //Error No.1: if base function has no exception declaration, overriding CANNOT add one  
30.      
31.    //public void func2() throws Exception {} //Error No.2: cannot implement interface; base and interface conflicts  
32.    public void func2() throws ExtException {} //implement interface and use Hint No.2  
33.      
34.    //public void func3() throws ExtException {} //Error No.3  
35.    //public void func3() throws AnotherException {} //Error No.3  
36.      
37.    public void func4() {} //Hint No.1: if base function has exception declaration, overriding CAN ommit  
38.    public void func5() throws ExtException {} //Hint No.2: if base function has exception declaration, overriding CAN declare ext exception  
39.      
40.    //public ExtImp() {} //Error No.4: ext's construcor must declare the exception the base constructor declare  
41.    public ExtImp() throws Exception {}   
42.    //public ExtImp() throws ExtException {} //Error No.4  
43.      
44.    public ExtImp(int i) throws Exception, ExtException {} //Hint No.3: once ext decalres throwing the base's exception, it CAN declare other exception (不一定非要是父类声明异常的子类), see Example2.java  
45.      
46.    //public ExtImp(float f) throws ExtException{} //Error No.5  
47.} 
//@file Example1.java

class ExtException extends Exception {}
class AnotherException extends Exception {}

class Base
{
public void func() {}

public void func2() throws Exception {}
public void func3() throws ExtException {}

public Base() throws Exception {}
public Base(int i) throws Exception {}
//public Base(float f) throws ExtException{} //Error No.5: every other constructor will call the default constructor; same as Error No.4
}

interface Inf
{
public void func2() throws ExtException;
//public void func3() throws AnotherException; //Error No.3: base and interface conflicts

public void func4() throws Exception;
public void func5() throws Exception;
}

class ExtImp extends Base implements Inf
{
//public void func()  throws ExtException{} //Error No.1: if base function has no exception declaration, overriding CANNOT add one

//public void func2() throws Exception {} //Error No.2: cannot implement interface; base and interface conflicts
public void func2() throws ExtException {} //implement interface and use Hint No.2

//public void func3() throws ExtException {} //Error No.3
//public void func3() throws AnotherException {} //Error No.3

public void func4() {} //Hint No.1: if base function has exception declaration, overriding CAN ommit
public void func5() throws ExtException {} //Hint No.2: if base function has exception declaration, overriding CAN declare ext exception

//public ExtImp() {} //Error No.4: ext's construcor must declare the exception the base constructor declare
public ExtImp() throws Exception {}
//public ExtImp() throws ExtException {} //Error No.4

public ExtImp(int i) throws Exception, ExtException {} //Hint No.3: once ext decalres throwing the base's exception, it CAN declare other exception (不一定非要是父类声明异常的子类), see Example2.java

//public ExtImp(float f) throws ExtException{} //Error No.5
}
Java代码
1.//@file Example2.java  
2. 
3.class ExtException extends Exception {}  
4.class AnotherException extends Exception {}  
5.class ThirdException extends Exception {}  
6.class FourthException extends ThirdException {}  
7. 
8.class Base  
9.{  
10.    public Base() {}  
11.    public Base(int i) throws ExtException {}  
12.    public Base(float f) throws ExtException {}  
13.      
14.    public void func() throws ThirdException { System.out.println("Base.func()");}  
15.}  
16. 
17.class Ext extends Base  
18.{  
19.    public Ext() throws Exception {}  //Hint No.4: ext's constructor CAN add exception declaration  
20.    public Ext(int i) throws ExtException, AnotherException {} //Hint No.4  
21.    public Ext(float f) throws Exception {} //Hint No.5: ext's constructor can declare base exception  
22.      
23.    public void func() throws FourthException { System.out.println("Ext.func()");}  
24.}  
25. 
26.public class Example2  
27.{  
28.    public static void main(String[] args)  
29.    {  
30.        try 
31.        {  
32.            Ext e = new Ext(5);  
33.            e.func();  
34.        }  
35.        catch (ExtException ee) {}  
36.        catch (AnotherException ae) {}  
37.        catch (FourthException fe) {} // ***DIFFERENCE***  
38.      
39.        try 
40.        {  
41.            Base b = new Ext(5);  
42.            b.func();  
43.        }  
44.        catch (ExtException ee) {}  
45.        catch (AnotherException ae) {}  
46.        catch (ThirdException te) {} // ***DIFFERENCE***  
47.    }  
48.}  
49. 
50.//output:  
51./* 
52.    Ext.func() 
53.    Ext.func() 
54.*/ 
//@file Example2.java

class ExtException extends Exception {}
class AnotherException extends Exception {}
class ThirdException extends Exception {}
class FourthException extends ThirdException {}

class Base
{
public Base() {}
public Base(int i) throws ExtException {}
public Base(float f) throws ExtException {}

public void func() throws ThirdException { System.out.println("Base.func()");}
}

class Ext extends Base
{
public Ext() throws Exception {}  //Hint No.4: ext's constructor CAN add exception declaration
public Ext(int i) throws ExtException, AnotherException {} //Hint No.4
public Ext(float f) throws Exception {} //Hint No.5: ext's constructor can declare base exception

public void func() throws FourthException { System.out.println("Ext.func()");}
}

public class Example2
{
public static void main(String[] args)
{
try
{
Ext e = new Ext(5);
e.func();
}
catch (ExtException ee) {}
catch (AnotherException ae) {}
catch (FourthException fe) {} // ***DIFFERENCE***

try
{
Base b = new Ext(5);
b.func();
}
catch (ExtException ee) {}
catch (AnotherException ae) {}
catch (ThirdException te) {} // ***DIFFERENCE***
}
}

//output:
/*
Ext.func()
Ext.func()
*/

  针对覆写方法,有以下几点原则:

  1. 如果基类方法没有声明异常,那么导出类的覆写方法也不能声明异常(Error No.1)。

  2. 如果基类方法有声明异常,那么导出类的覆写方法可以:(1)不声明异常;(2)声明抛出基类方法的异常;(3)声明抛出基类方法异常的导出类。(Hint No.1 & Hint No.2)

  3. 如果基类和接口有同签名方法,且导出类实现了接口,如果基类方法和接口方法声明的异常不同,则称基类与接口冲突。如果基类方法抛出的异常和接口方法声明的异常存在继承关系,则实现接口的导出类必须声明抛出导出异常(子异常)(Error No.2);如果如果基类方法声明的异常和接口方法声明的异常不存在继承关系,则冲突不可调和,需要修改基类或是接口(Error No.3)。

  4. 由Example2.java可见,对于向上转型Base b = new Ext(5),调用b.func()虽然会动态绑定调用Ext的func()方法,可是异常捕捉必须按照Base的func()方法的异常声明来捕捉(见DIFFERENCE处)。



  针对构造器的重写,有以下几点原则:

  1. 这里应该持这么一种观点,基类的带参构造器和导出类的所有构造器都默认调用了基类的默认构造器,Base(int i)调用了Base(),Ext()调用了super(),Ext(int i)调用了super(i),依次类推。所以一旦基类的默认构造器声明了异常,那么基类的带参构造器和导出类的所有构造器都必须声明异常,异常类型可以是基类默认构造器的异常或是其基类,而决不能是其导出类(Error No.4, Error No.5 & Hint No.5)。



p.s. 导出类构造器虽然不能声明导出异常,不过可以抛出导出异常,如:

Java代码
1.class Base  
2.{  
3.    public Base() throws NullPointerException {}   
4.}  
5. 
6.class Ext extends Base   
7.{  
8.    public Ext() throws Exception  
9.    {  
10.        throw new NullPointerException();  
11.    }  
12.} 
class Base
{
public Base() throws NullPointerException {}
}

class Ext extends Base
{
public Ext() throws Exception
{
throw new NullPointerException();
}
}所以牢记:声明异常和实际抛出异常完全是两码事。



  2. 如1.所说,构造器的重写实际是调用关系,所以一旦默认构造器没有声明异常,那么其他构造器就可以随便添加异常声明(Hint No.3 & Hint No.4)。

分享到:
评论

相关推荐

    [net毕业设计]ASP.NET基于BS结构的实验室预约模型系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    中医诊所系统,WPF.zip

    中医诊所系统,WPF.zip

    [net毕业设计]ASP.NET淘宝店主交易管理系统的设计与实现(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国各省、297个地级市公路里程面板数据1999-2021年-社科数据.zip

    全国各省、297个地级市公路里程面板数据1999-2021年涵盖了中国各地区公路建设的详细情况,是衡量地区基础设施水平的重要指标。这些数据不仅包括了全国31个省份的公路里程,还深入到了297个地级市的层面,提供了从1999年至2021年的连续年份数据。这些数据来源于各省统计年鉴、经济社会发展统计数据库、地级市统计年鉴以及地级市发展统计公报,确保了数据的准确性和权威性。通过这些数据,可以观察到中国公路交通建设的发展不平衡性,沿海地区和长江中下游地区公路交通密度较高,而西部地区相对较低。这些面板数据为研究中国城市化进程、区域经济发展以及交通基础设施建设提供了宝贵的信息资源。

    技术处工作事项延期完成申请单.docx

    技术处工作事项延期完成申请单.docx

    数据库详细设计说明书中文最新版本

    本文为图书馆管理课程设计SQL Server功能规范说明书。本说明书将: 描述数据库设计的目的; 说明数据库设计中的主要组成部分; 说明数据库设计中各功能的实现。 本文档主要内容包括对数据库设计结构的总体描述,对数据库中各种对象的描述(包括对象的名称、对象的属性、对象和其他对象直接的关系);在数据库主要对象之外,本文还将描述数据库安全性设置、数据库属性设置和数据库备份策略,为数据库管理员维护数据库安全稳定地运行提供参考;有需要的朋友可以下载看看

    WebSocketError(解决方案).md

    项目中常见的问题,记录一下解决方案

    octopart(样本).csv

    octopart数据格式样例

    [net毕业设计]ASP.NET通用作业批改系统设计(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    Oracle11gRAC安装与配置forLinux中文最新版本

    本文档主要讲述的是Oracle 11g RAC安装与配置for Linux;希望对大家的学习会有帮助 文档结构 第一部分:Oracle Grid Infrastructure安装 第二部分:Oracle Clusterware与Oracle Real Application Clusters安装前准备规程 第三部分:安装Oracle Clusterware与Oracle Real Application Clusters 第四部分:Oracle Real Application Clusters环境配置 第五部分:Oracle Clusterware与Oracle Real Application Clusters参考资料

    python教程.txt

    python教程.txt

    脸部痤疮检测数据集VOC+YOLO格式3763张7类别.zip

    文件太大放服务器下请务必到资源详情查看后然后下载 样本图:blog.csdn.net/2403_88102872/article/details/143979016 重要说明:数据集为小目标检测,训练map精度偏低属于正常现象,只要能检测出来即可。如果map低于0.5请勿奇怪,因为小目标检测是业界公认难检测的研究方向之一。 数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3763 标注数量(xml文件个数):3763 标注数量(txt文件个数):3763 标注类别数:7 标注类别名称:["blackheads","cyst","fore","nodule","papule","pustule","whiteheads"]

    ASP+ACCESS基于WEB社区论坛设计与实现(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国各地级市固定资产投资统计数据(附省、区县、行业)1996-2020年-社科数据.zip

    全国各地级市固定资产投资统计数据集覆盖了1996至2020年的时间跨度,提供了详尽的年度固定资产投资金额,单位为百万人民币。这些数据不仅包括了地级市级别的投资情况,还涵盖了省、区县以及行业等多个维度,为研究区域经济增长、投资结构和发展趋势提供了宝贵的数据支持。固定资产投资作为衡量一个地区经济发展活力和潜力的重要指标,反映了社会固定资产在生产、投资额的规模和速度。通过这些数据,研究人员可以深入分析不同地区、不同行业的投资特点,以及随时间变化的趋势,进而为政策制定和经济预测提供科学依据。

    training_plan_db.sql

    training_plan_db.sql

    [net毕业设计]ASP.NET多语种网络硬盘系统的设计(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    5.html

    5

    1-全国各省地区城乡收入差距、泰尔指数、城镇农村居民可支配收入统计数据1990-2021年-社科数据.zip

    全国各省地区城乡收入差距、泰尔指数、城镇农村居民可支配收入统计数据集提供了1990至2021年间的详细数据,覆盖全国31个省份。该数据集不仅包括城镇居民和农村居民的人均可支配收入,还涵盖了乡村人口、全体居民人均可支配收入、城镇人口以及年末常住人口等关键指标。泰尔指数作为衡量收入不平等的重要工具,通过计算城镇收入与农村收入之比,为研究者提供了一个量化城乡收入差距的科学方法。这些数据不仅有助于分析中国城乡之间的经济差异,还能为政策制定者提供决策支持,以缩小城乡差距、促进区域均衡发展。数据集的丰富性使其成为社会科学领域研究城乡发展、收入分配不平等等问题的宝贵资源。

    FileName.zip

    FileName.zip

    java面向对象 - 类与对象代码.zip

    java面向对象 - 类与对象java面向对象 - 类与对象代码.zip

Global site tag (gtag.js) - Google Analytics