Java:catch块可以是多态的吗?

4
在我准备复习的一篇论文中,有这样一个问题: "catch 块可以是多态的吗?" 如果是真的,对我来说,叫多个 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块是否具有多态性?

2
我猜这取决于你对多态性的定义。 - Oliver Charlesworth
4
对我来说,这听起来像是一道表述不清的考试题。 - whirlwin
你对多态的概念有一个奇怪而具体的理解。首先,名称与此无关。 - user2357112
等等,你是在考虑方法重载吗?那可以是多态的一种形式,但它远非唯一的形式。 - user2357112
@user2357112 嗯,我提到了名称,因为它似乎不是动态多态性,而我认为静态多态性是基于名称和不同参数的。 - DagdA
@whirlwin 是的,这篇论文包含一个有多个真/假问题的问题。另一个问题是“实现接口的最终类不需要实现所有接口方法[sic]”。这取决于超类是否实现了接口的方法,可能是真的或假的,如果我没记错的话。讲师很棒。 - DagdA
4个回答

3
您发布的示例应该被描述为重载。唯一不同于重载的是需要在子类出现之前保证可读性。
语句“多态catch块”需要一些技巧才能解析。
完成这些技巧后,我会将其解释为:
  • 一个catch块根据被捕获对象的类型提供不同的实现。
类似于:
try{


} catchwith ( catchHandlerObject );

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

这里的 Is

无法翻译,请提供更多上下文。
class C{
   public void m(Object o){ .... };
}

m(Object o)是多态的吗? 我认为大多数人都认为在这个描述中包含多态是不必要的。调用m(stringObject)并不表示多态。

我反对之前的帖子,说不是。 多态不是正确的标签。多态不是描述正在发生的情况的正确方式。

我也真的认为你应该与你的TA或教授再次核实这一点。问题通常会出现拼写错误或完全脱离常规的经历。

正如yshavit所指出的,重载表示编译时绑定。 捕获块必须在运行时解析。我无法找到比重载更好的术语。


1
嗯,我不太敢称之为重载,因为Java中的方法重载总是在编译时解决的;catch子句在运行时解决,并且在这个意义上更类似于多态性。并不是说它们是多态的,我同意你的看法。我不会用任何一个术语来称呼它们。 - yshavit
谢谢你们两个!我的讲师正在度假,而明天就要考试了,所以我不能问她。但是她经常在真/假部分提出不清楚的问题,比如“实现接口的最终类不需要实现所有接口方法[sic]”,这取决于未实现的方法是否由超类实现。因此,如果有任何类似这样的问题,我会解释一下情况。 - DagdA
2
@PeadarÓDuinnín 确实,这两个问题都不适合用真/假格式回答,并且陈述也不够清晰。 - Captain Giraffe

2

catch块可以具有多态性吗?

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


2
有效地,catch语句的意思是“捕获任何这个类或这个类的子类的异常”——任何在instanceof检查中返回true的异常都会被捕获。
因此,按照大多数定义,这就是多态。

1
如果您的try块抛出一个FileNotFoundException异常或其任何子类,则第一个catch块将被调用。
如果您的try块抛出一个IOException异常,或其任何不是FileNotFoundException或FileNotFoundException的子类的子类,则将调用第二个catch块。
如果您的try块抛出任何其他异常,则不会执行任何catch块。
因此,可以说它们是多态的,因为它们接受作为参数的异常类型或该类型的任何子类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接