我这里有点困境,
说我有一个班级
public class Child extends Parent implements Interface{
public static void main(String[] args){
Child child = new Child();
child.methodOne(); } }
,其中
abstract class Parent {
public void methodOne() {
System.out.print("cannot fly ");
}}
interface Interface {
public abstract void methodOne() throws Exception;}
此结构没有编译错误
如果我这样做的话
abstract class Parent {
public void methodOne() throws Exception {
System.out.print("cannot fly ");
}}
interface Interface {
public abstract void methodOne(); }
两个恭维错误上升说
Exception Exception in throws clause of Parent.methodOne() is not compatible with Interface.methodOne()
和
Unhandled exception type Exception
要求在throws
方法中添加try/catch
或main
为什么会这样?
答案 0 :(得分:4)
每次实现接口(或从父类重写方法,同样的事情)时,您需要尊重该接口的合同。尊重合同意味着您不能抛出比接口声明更多的异常。
在这两种情况下,Interface
都是合同,Parent
是实现(通过类Child
中发生的两者之间的“绑定”)。
在第一种情况下,界面说methodOne()
允许抛出异常,但不必。您在Parent
中的实际实现不会抛出任何内容,因此它是合同的一个子集,并且没问题。
在第二种情况下,接口说methodOne()
不会抛出任何东西(*),因此任何实现都不允许抛出任何异常。但是,Parent
中的实现要求允许抛出,这与接口契约不兼容;因此编译错误。
另请注意,在第二种情况下,您可以使用空methodOne()
声明覆盖Child
中的throws
,以便签名符合接口合同。然后,您可以拨打super.methodOne()
并将Exception
重新设为RuntimeException
(例如)。
顺便说一下:
throws
声明的交集; abstract
关键字,因为接口中的方法声明本质上总是抽象的。(*)当然除了RuntimeException。
答案 1 :(得分:3)
当你这样做时,
public class Child extends Parent implements Interface
但是,当您在父exception
'中明确抛出class
时方法,您必须在从子对象进行调用时处理该异常。
答案 2 :(得分:1)
methodOne()
声明不属于界面Interface
中throws
合约的一部分。
无论何时实现接口,都必须实现方法契约,如果接口具有throws
声明,则可以在不添加Interface
声明的情况下执行此操作。
但是,您无法添加 main
合同中未说明的功能。
您可以通过修改Exception
方法同时抛出 public static void main(String[] args) throws Exception {
Child child = new Child();
child.methodOne();
}
来解决其他错误:
methodOne()
或围绕try-catch
块中的 public static void main(String[] args) throws Exception {
Child child = new Child();
try{
child.methodOne();
}catch(Exception e){
//do something to handle exception i.e. System.out.println(e.getMessage());
}
}
来电:
[i for i in range(3)]
补充阅读:Java interface throws an exception but interface implementation does not throw an exception?
摘录:
实施和扩展的一般规则是,您可以使新的类或界面“限制性更小”,但不能“限制性更强”。如果您考虑将异常作为限制处理的要求,则不声明该异常的实现限制较少。任何编码到界面的人都不会遇到你班级的问题。