Java 摘要 Class 声明可抛出 - 实现不强制执行?

Java Abstract Class declares throwable - implementation does not enforce it?

我想知道使用抽象 class 和接口之间的区别,这让我有点困惑:

假设你有一个摘要class

public abstract class Animal {   
//return the tail lenght of the animal
public abstract int getTailLength() throws IllegalStateException;
}

承诺抽象 class 的实现有一个名为 getTailLength() 的方法 [编译器强制扩展 classes 以 @override 抽象 class 并实现它们] 像这样:

public Snake extends Animal(){

@override
public int getTailLength(){
  return 10;
}
}

编译器在摘要中对此没有问题 class 当我们声明要实现 getTailLenght() 时,我们还提到我们希望它抛出异常 - 但在上面的代码片段中有被省略了。

我是否认为在对接口和 'implements' 声明做同样的事情时不允许这样做?

我想是因为你用@override 注释了方法,只要你有一个在ADT 中强制执行的名称的方法,编译器根本不关心你做了什么?它会检查 return 类型,为什么它不强制执行异常?

我们不希望该方法一直抛出异常(否则我们永远得不到有意义的结果),我们说 "this method MAY throw this exception"。如果没有意义,让子类不抛出异常是完全可以的。

如果您的客户端代码知道它正在处理子类,那么它就不必处理异常,这是一个额外的好处。

在您的实现中不声明 throw 子句来实现声明 throw 子句的接口方法也是完全可以的。