Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异常构造函数与异常Java_Java_Exception_Inheritance_Constructor - Fatal编程技术网

异常构造函数与异常Java

异常构造函数与异常Java,java,exception,inheritance,constructor,Java,Exception,Inheritance,Constructor,有人知道为什么对于重写过程,重写方法必须抛出与被重写方法相同类型或子类型的异常,而另一方面,对于构造函数,它以相反的方式工作,因此必须抛出与超类抛出的相同异常或超类型。 非常感谢。构造函数不会重写其超类的构造函数,但它们会显式或隐式调用超类构造函数。因此,就像调用引发异常的其他方法的方法一样,构造函数必须捕获超类的构造函数引发的异常,或者必须声明它引发了相同的异常或该异常的超类 另一方面,重写方法必须遵守超类的方法定义。因此,它可以抛出更具体的异常,或者根本不抛出异常。但它不能抛出更广泛的异常,

有人知道为什么对于重写过程,重写方法必须抛出与被重写方法相同类型或子类型的异常,而另一方面,对于构造函数,它以相反的方式工作,因此必须抛出与超类抛出的相同异常或超类型。
非常感谢。

构造函数不会重写其超类的构造函数,但它们会显式或隐式调用超类构造函数。因此,就像调用引发异常的其他方法的方法一样,构造函数必须捕获超类的构造函数引发的异常,或者必须声明它引发了相同的异常或该异常的超类


另一方面,重写方法必须遵守超类的方法定义。因此,它可以抛出更具体的异常,或者根本不抛出异常。但它不能抛出更广泛的异常,因为这将违反超类的约定。

构造函数不会覆盖其超类的构造函数,但它们会显式或隐式调用超类构造函数。因此,就像调用引发异常的其他方法的方法一样,构造函数必须捕获超类的构造函数引发的异常,或者必须声明它引发了相同的异常或该异常的超类


另一方面,重写方法必须遵守超类的方法定义。因此,它可以抛出更具体的异常,或者根本不抛出异常。但是它不能抛出更广泛的异常,因为这将违反超类的约定。

我相信对子类构造函数没有这样的限制。它们可以抛出它们关心的任何类型的异常,与超类构造函数抛出的类型无关。显然,如果他们让超类构造函数中的异常通过,他们将不得不声明它或它的超类型,就像其他任何方法一样。不过,这并不是对子类构造函数的特定限制:您可以通过抛出其他类型的异常来轻松捕获和处理异常

原因是子类中的构造函数不会“重写”超类中的构造函数,也不会以多态方式使用。它是一个独立的东西,就像一个名为Subclass.B的函数独立于超类.a


此外,您总是知道,当您调用新的子类时,您正在调用该构造函数。然而,如果您有一个对超类的引用,并对其调用Superclass.OverridedMethod,则无法确定类型是什么。因此,任何重写该方法的子类都不能抛出超类上声明的异常以外的异常,就像它们不能更改方法签名的其余部分一样。

我相信子类构造函数没有这样的限制。它们可以抛出它们关心的任何类型的异常,与超类构造函数抛出的类型无关。显然,如果他们让超类构造函数中的异常通过,他们将不得不声明它或它的超类型,就像其他任何方法一样。不过,这并不是对子类构造函数的特定限制:您可以通过抛出其他类型的异常来轻松捕获和处理异常

原因是子类中的构造函数不会“重写”超类中的构造函数,也不会以多态方式使用。它是一个独立的东西,就像一个名为Subclass.B的函数独立于超类.a


此外,您总是知道,当您调用新的子类时,您正在调用该构造函数。然而,如果您有一个对超类的引用,并对其调用Superclass.OverridedMethod,则无法确定类型是什么。因此,任何重写该方法的子类都不能抛出超类上声明的异常以外的异常,就像它们不能更改方法签名的其余部分一样。

在构造函数中,总是可能隐式调用super。 抛出一个超级类异常也将捕获该异常

public B() {
    ... initialize fields declared with X x = ...;
    ... call super constructor
    ... body of constructor
}

但是,重写方法可以更具体,也可以用于例外情况:减少可能性。

在构造函数中,总是可能隐式调用super。 抛出一个超级类异常也将捕获该异常

public B() {
    ... initialize fields declared with X x = ...;
    ... call super constructor
    ... body of constructor
}

但是,覆盖方法可以更为具体,也适用于例外情况:减少可能性。

事实并非如此。所以这个问题没有意义。子类构造函数不会重写其超类构造函数。它叫它,那不是真的。所以这个问题没有意义。子类构造函数不会重写其超类构造函数。它叫它。