方法覆盖异常

时间:2019-09-17 05:16:42

标签: java exception polymorphism overriding

我有一个以下程序:

class SuperClassWas {
    void myM() throws NullPointerException{
        System.out.println("Super class myM called.");
    }
}

class SubClassWas extends SuperClassWas{
    void myM() throws RuntimeException{
        System.out.println("Sub class myM called.");
    }
}

public class MethodOveridingWithException {
    public static void main(String[] args) {
        SuperClassWas obj = new SubClassWas();
        obj.myM();
    }
}

按照规则

  

如果SuperClass声明了异常,则SubClass只能声明SuperClass声明的异常的子级异常,而不能声明其他任何异常。

在我的程序中,超类方法myM扩展了NullPointerException,子类重写方法myM扩展了RuntimeException,当我尝试运行该程序时,它运行良好。问题是为什么?理想情况下,它应该不起作用,因为RuntimeException不是NullPointerException的子类。

如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:5)

此规则仅对checked exceptions有效。

这里是JLS的引文:

  

更准确地说,假设B是一个类或接口,而A是一个   B的超类或超接口,以及B中的方法声明n   覆盖或隐藏A中的方法声明m。然后:

     

如果n的throws子句提到任何 checked 异常类型,   那么m必须具有throws子句,否则会发生编译时错误。

     

对于n的throws子句中列出的每个 checked 异常类型,   同一异常类或其超类型之一必须出现在   擦除(第4.6节)m的throws子句;否则,编译时   错误发生。

     

如果m的未擦除throws子句不包含的超类型   n的throws子句中的每个异常类型,一个编译时   发生未经检查的警告。

问题中的例外是未经检查的例外。

答案 1 :(得分:0)

我的理解如下

    If Subclass overriden method throws checked exception then superclass overridden method should throws supertypes of subclass exception or atleast same exception.
    If Subclass overriden method throws unchecked exception then superclass overridden method can throws any type of exception or no exception.         
    If Subclass overriden method throws no exception then superclass overridden method can throws any type of exception or no exception.    
相关问题