4

在我准备复试的一篇论文中,有人问我“catch blocks 可以是多态的吗?”。

catch如果为真,那么将多个块称为多态对我来说没有意义。如果catch块无法命名并且仅在其方法头中包含参数,是否是多态性?

例如:

try {

//...

} catch (FileNotFoundException e) {
    System.err.println("FileNotFoundException: " + e.getMessage());
    throw new SampleException(e);

} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

在此,这两个catch块是多态的吗?

4

4 回答 4

3

您发布的示例应描述为重载。与重载唯一不同的是子类出现在其超类之前的可读性要求。

语句“多态捕获块”需要一些体操来解析。

完成上述体操后,我将其解释为

  • 根据被捕获对象的类型提供不同实现的 catch 块。

类似的东西

try{


} catchwith ( catchHandlerObject );

而 catchHandlerObject 是多态的。即根据catchHandlerObject 的(运行时)类型不同地处理相同的异常。

class C{
   public void m(Object o){ .... };
}

m(Object o)多态的吗?我想说,共识是没有必要在这个描述中包含多态性。一个电话m( stringObject )。不表示多态性。

我与之前的海报相反,说不。多态不是标记这种情况的正确方法。多态性不是描述正在发生的事情的正确方法。

我也真的认为您应该与您的助教或教授仔细检查。问题经常发生,包括从拼写到完全失忆的错误。

正如yshavit 所指出的,重载表示编译时绑定。catch-block 必须在运行时解析。不过,我找不到比重载更好的术语。

于 2014-08-17T13:23:18.757 回答
2

catch 块可以是多态的吗?

我会对这个问题回答“是”,因为catch块不仅可以接受它们声明要捕获的异常,还可以接受它们的直接或间接子类。您不需要多个catch块来显示多态行为 - 单个块就足够了。实际上,您的示例中有一个这样的块:它是捕获的最后一个块IOException

于 2014-08-17T12:47:04.347 回答
2

实际上,catch这句话说的是“捕获作为此类的实例或此类的子类的任何异常” - 任何会trueinstanceof检查时返回的东西。

因此,根据大多数定义,这将是多态的。

于 2014-08-17T13:04:49.143 回答
1

如果您的 try 块抛出异常,即 aFileNotFoundException或 的任何子类,则将调用FileNotFoundException第一个块。catch

如果你的 try 块抛出一个异常IOException,或者它的任何子类IOException不是FileNotFoundException,或者一个子类FileNotFoundException,那么第二个 catch 块将被调用。

如果您的try块抛出任何其他异常,则不会执行任何 catch 块。

所以,我想你可以说它们是多态的,因为它们接受它们作为参数的异常类型,或者这种类型的任何子类型。

于 2014-08-17T12:42:32.927 回答