在一篇重复考试的论文中,我问过"可以捕获块是多态的吗?"。
如果是真的,那么调用多个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
块是多态的吗?
答案 0 :(得分:3)
您发布的示例应描述为重载。唯一与重载不同的是可读性要求,即子类出现在其超类之前。
声明" Polymorphic catch blocks"需要一些体操来解析。
完成所说的体操后,我会把它解释为
类似于
的东西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
的任何子类FileNotFoundException
或FileNotFoundException
的子类,那么第二次捕获块将被调用。
如果您的try
块抛出任何其他异常,则不会执行任何catch块。
所以,我猜你可以说它们是多态的,因为它们接受它们作为参数的异常类型,或者这种类型的任何子类型。