zoukankan      html  css  js  c++  java
  • Java 异常 重写抛出异常限制

      1 子类在重写父类抛出异常的方法时,要么不抛出异常,要么抛出与父类方法相同的异常或该异常的子类。如果被重写的父类方法只抛出受检异常,则子类重写的方法可以抛出非受检异常。例如,父类方法抛出了一个受检异常IOException,重写该方法时不能抛出Exception,对于受检异常而言,只能抛出IOException及其子类异常,也可以抛出非受检异常。

      举例如下:

     1 class A {  
     2     public void fun() throws Exception {  
     3           
     4     }  
     5 }  
     6 class B extends A {  
     7     public void fun() throws IOException, RuntimeException {  
     8           
     9     }  
    10 }  

      父类抛出的异常包含所有异常,上面的写法正确。

     1 class A {  
     2     public void fun() throws RuntimeException {  
     3           
     4     }  
     5 }  
     6 class B extends A {  
     7     public void fun() throws IOException, RuntimeException {  
     8           
     9     }  
    10 }  

      子类IOException超出了父类的异常范畴,上面的写法错误。

     1 class A {  
     2     public void fun() throws IOException {  
     3           
     4     }  
     5 }  
     6 class B extends A {  
     7     public void fun() throws IOException, RuntimeException, ArithmeticException {  
     8           
     9     }  
    10 }  

      RuntimeException不属于IO的范畴,超出了父类的异常范畴。RuntimeException和ArithmeticException属于运行时异常,子类重写的方法可以抛出任何运行时异常。所以上面的写法正确。

       

      2 子类在重写父类抛出异常的方法时,如果实现了有相同方法签名的接口且接口中的该方法也有异常声明,则子类重写的方法要么不抛出异常,要么抛出父类中被重写方法声明异常与接口中被实现方法声明异常的交集。

      举例如下:

     1 class Test
     2 {
     3     public Test() throws IOException
     4     {}
     5     void test() throws IOException
     6     {}
     7 }
     8 
     9 interface I1{
    10     void test() throw Exception;
    11 }
    12 
    13 class SubTest extends Test implements I1
    14 {
    15     public SubTest() throws Exception,NullPointerException, NoSuchMethodException
    16     {}
    17     void test() throws IOException
    18    {}
    19 }

      在SubTest类中,test方法要么不抛出异常,要么抛出IOException或其子类(例如,InterruptedIOException)。

      参考资料

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

           java方法重写时的异常限制

  • 相关阅读:
    ios-UI-汤姆猫德游戏实现
    struts2在action中获取request、session、application,并传递数据
    centos 下 KVM虚拟机的创建、管理与迁移
    Java学习之道:Java 导出EXCEL
    __FUNCTION__, __LINE__ 有助于debug的宏定义
    unity坐标转换问题
    win10 bcdedit加入vhdx启动
    网页爬虫框架jsoup介绍
    Redis命令-HyperLogLog
    [Swift]LeetCode456. 132模式 | 132 Pattern
  • 原文地址:https://www.cnblogs.com/WJQ2017/p/7762424.html
Copyright © 2011-2022 走看看