Java:可以捕获块是多态的吗?

时间:2014-08-17 12:38:08

标签: java polymorphism catch-block

在一篇重复考试的论文中,我问过"可以捕获块是多态的吗?"。

如果是真的,那么调用多个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 个答案:

答案 0 :(得分:3)

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

声明" Polymorphic catch blocks"需要一些体操来解析。

完成所说的体操后,我会把它解释为

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

类似于

的东西
try{


} catchwith ( catchHandlerObject );

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

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

m(Object o)是多态的吗?我想说的是,共识是没有必要在本说明中包含多态性。致电m( stringObject )。并不表示多态性。

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

我也真的认为你应该和TA或你的教授仔细检查一下。它经常发生,问题包括从拼写到完全无心经验的错误。

yshavit 所述,重载表示编译时绑定。必须在运行时解决catch-block。我不知道如何找到比过载更好的术语。

答案 1 :(得分:2)

  

可以捕获块是多态的吗?

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

答案 2 :(得分:2)

实际上,catch短语表示"捕获任何异常,该异常是此类的实例或此类的子类" - 任何在true支票上返回instanceof的内容。

因此,大多数定义都是多态的。

答案 3 :(得分:1)

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

如果你的try块抛出的异常是IOException,或IOException的任何子类FileNotFoundExceptionFileNotFoundException的子类,那么第二次捕获块将被调用。

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

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