gpt4 book ai didi

java - 在 Java 中处理重写方法层次结构中的异常

转载 作者:行者123 更新时间:2023-11-29 05:50:54 25 4
gpt4 key购买 nike

考虑一个 Java 类层次结构,例如:

abstract class Exp { public void generate(); }
class EffExp extends Exp {...}
clas PureExp extends Exp {...}
class NewExp extends EffExp {...}
etc, etc.

NewExp 中的 generate 的实现已更改为抛出 IOException

public void generate() throws IOException {...}

generate 的其他实现不执行任何 IO,因此不需要抛出它。编译器提示并强制我声明类层次结构中的所有方法以抛出异常。这真的是唯一的出路吗?这似乎相当具有侵扰性。

我当然可以在 NewExp 内部捕获异常发生的地方,但这并没有什么意义。异常应该传播到顶部并停止程序执行。

这里更普遍的问题是:如果你有一个相互覆盖的方法层次结构,是否必须声明它们都抛出相同的异常集?

最佳答案

只要记住一条规则:-

  • 您不能对覆盖的方法添加更多限制。限制可以是例如: - 添加一个新的 Checked Exception,降低方法可见性。

所以,如果你不得不(别无选择),让你的覆盖方法抛出一个Checked Exception(注意,你可以添加一个未检查的异常,但它没有任何意义), 只需在您要覆盖的方法的 throws 子句中添加异常。

因此,简单来说,您的覆盖 方法的签名应该与覆盖它的方法完全匹配。


现在这背后的简单推理是 - 多态性

如您所知,在多态性中,您可以将父类(super class)型 引用指向子类对象。所以,你可以:-

SupClass ref = new SubClass();
ref.method1();

现在,在检查 method1 是否存在时,编译器只关心引用类型。因此,它检查 SupClass,并相应地允许访问。

现在,想象一下会发生什么,在运行时,当 ref 实际上指向 SubClass 对象时,JVM 发现 method1 抛出一个新的异常,编译器 未检查该异常。它会崩溃。这就是不允许这样做的原因。

关于java - 在 Java 中处理重写方法层次结构中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com