在java中使用带有重写方法的throws子句时出错?

时间:2014-05-21 10:09:53

标签: java exception

当我使用方法demo()的throw子句时,我收到错误。我想知道在继承中使用throws的限制是什么。

错误是:异常ClassNotFoundExceptionTest.demo()中的throws子句不兼容。

Class Test
{
    public void demo() throws NumberFormatException, ArrayIndexOutOfBoundsException//error 
    {
        //something here
    }
    public void demo(String s)
    {
        //something here
    }
}//end of Test class

public class MyTest extends Test 
{
    public void demo() throws IndexOutOfBoundsException,ClassNotFoundException
    {
        //something here
    }
    public static void main(String[] args) 
    {

    }
}

3 个答案:

答案 0 :(得分:3)

ClassNotFoundException已检查的例外 - 并且您无法声明方法覆盖会抛出任何已检查的异常,而该覆盖的方法不会覆盖该方法。 t声明。

来自section 8.4.8.3 of the JLS

  

覆盖或隐藏另一个方法的方法(包括实现接口中定义的抽象方法的方法)可能不会被声明为抛出比重写或隐藏方法更多的已检查异常。

考虑一下,例如:

Test t = new MyTest();
t.demo();

该代码中没有任何内容表明ClassNotFoundException会被抛出,因为Test.demo()并未声明它会被抛出。但是,检查异常的重点是调用者强制考虑如何处理它们(捕获它们或声明它们也可能抛出异常)。覆盖方法并声明它抛出原始方法声明未涵盖的新检查异常的能力将使这一点无效。

答案 1 :(得分:1)

它引发了编译器错误,因为你破坏了Java(以及OOP中的)继承的核心原则之一。这个原则是,即使我们讨论访问类型或声明的异常类型,重写成员也不能像重写成员那样对被调用者施加更多限制,如超类中所声明的那样。

在您的情况下,ClassNotFoundException未在超类中声明,也未在其任何祖先中声明。

答案 2 :(得分:0)

当您重写子类中的方法时,throws子句必须与重写的方法兼容。在您的情况下,您的Test.demo()方法throws NumberFormatException, ArrayIndexOutOfBoundsException对于throws子句不是强制性的,因为它们是RuntimeExceptions

在你的MyTest.demo()方法中,你抛出IndexOutOfBoundsException,ClassNotFoundException,其中IndexOutOfBoundsException是一个RuntimeException,并且它也不是必须抛出的。 ClasssNotFoundException是一个已检查的异常,您的父类demo()方法中没有任何内容可以匹配它。因此你得到的错误。

要纠正的两个选项:

  
      
  1. 将ClassNotFoundException添加到Test.demo()
  2.   
  3. 将其从MyTest.demo()
  4. 中删除   

希望这有帮助

相关问题