在java中使用带有重写方法的throws子句时出错?
在方法在java中使用带有重写方法的throws子句时出错?,java,exception,Java,Exception,在方法demo()中使用throw子句时,我遇到了一个错误。我想知道在继承中使用throw的限制是什么 错误是:异常ClassNotFoundException与Test.demo()中的throws子句不兼容 ClassNotFoundException是一个选中的异常-您不能声明一个方法重写将抛出它重写的方法没有声明的任何选中的异常 发件人: 重写或隐藏另一个方法(包括实现接口中定义的抽象方法的方法)的方法不能声明为抛出比重写或隐藏方法更多的检查异常 例如,考虑: Test t = new
demo()
中使用throw子句时,我遇到了一个错误。我想知道在继承中使用throw的限制是什么
错误是:异常ClassNotFoundException
与Test.demo()
中的throws子句不兼容
ClassNotFoundException
是一个选中的异常-您不能声明一个方法重写将抛出它重写的方法没有声明的任何选中的异常
发件人:
重写或隐藏另一个方法(包括实现接口中定义的抽象方法的方法)的方法不能声明为抛出比重写或隐藏方法更多的检查异常
例如,考虑:
Test t = new MyTest();
t.demo();
该代码中没有任何内容表明将抛出
ClassNotFoundException
,因为Test.demo()
没有声明将抛出它。但是,检查异常的整个点是调用方被迫考虑如何处理它们(捕获它们或声明它们也可能抛出异常)。重写一个方法并声明它抛出一个原始方法声明中未包含的新的已检查异常的能力将使这变得毫无意义。ClassNotFoundException
是一个已检查异常-并且您不能声明一个方法重写将抛出它重写的方法未包含的任何已检查异常申报
发件人:
重写或隐藏另一个方法(包括实现接口中定义的抽象方法的方法)的方法不能声明为抛出比重写或隐藏方法更多的检查异常
例如,考虑:
Test t = new MyTest();
t.demo();
该代码中没有任何内容表明将抛出
ClassNotFoundException
,因为Test.demo()
没有声明将抛出它。但是,检查异常的整个点是调用方被迫考虑如何处理它们(捕获它们或声明它们也可能抛出异常)。重写一个方法并声明它抛出一个原始方法声明中未包含的新的已检查异常的能力将使这变得毫无意义。当您重写子类中的方法时,throws子句必须与重写的方法兼容。在您的例子中,您的Test.demo()
方法抛出NumberFormatException、ArrayIndexOutOfBoundsException
,它们对于throws子句不是必需的,因为它们是运行时异常
在MyTest.demo()方法中,您抛出的是IndexOutOfBoundsException,ClassNotFoundException
,其中IndexOutOfBoundsException
是一个运行时异常,这也不是必须抛出的ClasssNotFoundException
是一个选中的异常,并且父类demo()方法中没有任何内容可以匹配它。因此,您将得到错误
要更正的两个选项:
希望这有助于当您重写子类中的方法时,throws子句必须与被重写的方法兼容。在您的例子中,您的
Test.demo()
方法抛出NumberFormatException、ArrayIndexOutOfBoundsException
,它们对于throws子句不是必需的,因为它们是运行时异常
在MyTest.demo()方法中,您抛出的是IndexOutOfBoundsException,ClassNotFoundException
,其中IndexOutOfBoundsException
是一个运行时异常,这也不是必须抛出的ClasssNotFoundException
是一个选中的异常,并且父类demo()方法中没有任何内容可以匹配它。因此,您将得到错误
要更正的两个选项:
希望这有助于它会引发编译器错误,因为您破坏了Java(以及OOP本身)中继承的核心原则之一。这个原则是,重写成员不能像在超类中声明的那样,对调用方施加比重写成员更多的限制,即使我们讨论访问类型或声明的异常类型
在您的例子中,
ClassNotFoundException
不在超类中声明,也不在它的任何祖先中声明。它会引发编译器错误,因为您破坏了Java(以及OOP本身)中继承的一个核心原则。这个原则是,重写成员不能像在超类中声明的那样,对调用方施加比重写成员更多的限制,即使我们讨论访问类型或声明的异常类型
在您的情况下,
ClassNotFoundException
未在超类中声明,也未在其任何祖先中声明。您收到的错误消息是什么?您的demo()方法不应在子类中引发不同的异常,而父类seexception ClassNotFoundException与Test.demo()中的throws子句不兼容@WhoAmI:如果它们是未经检查的例外,它可以。问题是选中了ClassNotFoundException
。@user2534106:请将其编辑到您的问题中,然后修复代码的缩进。请阅读您收到的错误消息是什么?您的demo()方法不应在子类和父类中引发不同的异常seException ClassNotFoundException与Test.demo()中的throws子句不兼容。@WhoAmI:如果它们是未选中的异常,则可以。问题是选中了ClassNotFoundException
。@user2534106:请将其编辑到您的问题中,然后修复代码的缩进。请阅读