有人知道为什么对于重写过程,重写方法必须抛出被覆盖方法的相同类型(或子类型)的异常,而另一方面,对于构造函数,它以相反的方式工作(因此,必须抛出相同的方法)超类投掷的异常或超类型。 非常感谢。
答案 0 :(得分:4)
构造函数不会覆盖它们的超类的构造函数,但是它们显式或隐式地调用超类构造函数。因此,就像调用抛出Exception
的其他方法的方法一样,构造函数必须捕获超类的构造函数抛出的异常,或者它必须声明它抛出相同的异常(或该异常的超类) 。
另一方面,重写方法必须遵循超类的方法定义。因此,它可以抛出更具体的异常或根本不抛出异常。但它不能引发更广泛的例外,因为这会违反超类的合同。
答案 1 :(得分:0)
我相信对子类构造函数没有这样的限制。他们可以抛出他们关心的任何类型的Exception,与超类构造函数抛出的类型无关。显然,如果他们从超类构造函数中获取异常,则必须声明它或其超类型,就像使用任何其他方法一样。这不是对子类构造函数的特定限制:您可以通过抛出其他类型来轻松捕获和处理异常。
为什么子类中的构造函数不会“覆盖”超类中的构造函数,并且不会以多态方式使用。它是一个独立的东西,就像一个名为Subclass.B()
的函数独立于Superclass.A()
。
此外,始终知道当您致电new Subclass()
时,您正在调用该构造函数。如果您有Superclass
的引用,并在其上调用superclass.overriddenMethod()
,则无法确定该类型是什么。因此,任何覆盖该方法的子类都不能抛出除超类上声明的异常之外的异常,只不过它们可以更改方法签名的其余部分。
答案 2 :(得分:0)
在构造函数中总是有一个(可能是隐式的)super调用。 抛出一个超类Exception也会抓住它。
public B() {
... initialize fields declared with X x = ...;
... call super constructor
... body of constructor
}
然而,一个重要的方法可以更具体,也可以用于例外:减少可能性。