Вячеслав Чернышов Asked:2020-09-02 03:54:25 +0000 UTC2020-09-02 03:54:25 +0000 UTC 2020-09-02 03:54:25 +0000 UTC 为什么不能在重写(@Override)方法中抛出异常? 772 各位晚上好。 我遇到了重写方法的一个有趣特性——不能在其中抛出异常,只能在方法内部进行处理。但为什么?我想得到这个问题的明确答案。 java 2 个回答 Voted Best Answer therainycat 2020-09-02T04:13:03Z2020-09-02T04:13:03Z Java 中有两种类型的异常 - 检查和未检查,您可以阅读更多内容,例如,在这篇文章中。 已检查的异常在应用程序编译阶段进行检查,并且必须在某处捕获(catch),并且抛出此类异常的方法必须在其签名中具有可以抛出的异常类型(例如void method() throws Exception)。当覆盖 (@Override) 签名中没有 throws 的方法时,您不能抛出已检查异常,因为编译器无法跟踪它。非工作示例: class A { void foo() {} } class B extends A { @Override void foo() throws Exception {} } A obj = new B(); obj.foo(); // Компилятор рассматривает obj как A, в котором нет throws, и не знает о том, что он бросает checked-исключение 您可以基于 RuntimeException 或 Error 引发未经检查的异常,而无需将 throws 添加到重载的方法签名中。当然,如果您不需要检查异常。 Sergey Gornostaev 2020-09-02T04:05:01Z2020-09-02T04:05:01Z 是的,如果被覆盖的超类方法被声明为抛出相同类型的异常或基类。这是OOP- LSP的基本原则之一。
Java 中有两种类型的异常 - 检查和未检查,您可以阅读更多内容,例如,在这篇文章中。
已检查的异常在应用程序编译阶段进行检查,并且必须在某处捕获(catch),并且抛出此类异常的方法必须在其签名中具有可以抛出的异常类型(例如
void method() throws Exception)。当覆盖 (@Override) 签名中没有 throws 的方法时,您不能抛出已检查异常,因为编译器无法跟踪它。非工作示例:您可以基于 RuntimeException 或 Error 引发未经检查的异常,而无需将 throws 添加到重载的方法签名中。当然,如果您不需要检查异常。
是的,如果被覆盖的超类方法被声明为抛出相同类型的异常或基类。这是OOP- LSP的基本原则之一。