【问题标题】:Undefined method in multiple-exception-catch多异常捕获中的未定义方法
【发布时间】:2017-06-01 17:00:35
【问题描述】:

我有两个继承自 java.lang.Exception 的类。他们都有一个签名相同的方法void a(){...}。它们都可以放在代码块中。如果我这样做:

catch (SubException1 | SubException2 e)
    {
        e.a();
    }

然后它不会编译,因为方法a() 不属于异常。这是Java语言缺陷吗?我应该如何正确设计我的代码以防止代码冗余?

【问题讨论】:

  • 签名无所谓,是不是一些普通超类的方法一样? a 是否在 SubException1SubException2 的某个公共超类中定义?
  • 您可以通过为它们提供一个具有规定方法void a() 的共同祖先来消除冗余。然后就可以抓到祖宗了,调用e.a()
  • 当使用 multicatch 时,异常局部变量的实际类型是最接近的常见超类型,在您的情况下它看起来像 Exception。所以SubException1a() 并不重要。正如已经建议的那样,您可以通过在两种方法上使用带有 a() 的公共超类型来解决此问题。

标签: java exception catch-block multi-catch


【解决方案1】:

当您在单个 catch 语句中捕获多个异常类型时,所捕获异常的推断类型是这些类的最大公分母。在您的情况下,最大公分母是Exception,它没有void a() 方法。为了让 catch 块可以访问它,您可以将其提取到一个公共基类中,或者(可以说)更优雅地在两个类都实现的接口中定义它:

public interface SomeExceptionInterface {
    void a();
}

public class SomeException extends Exception implements SomeExceptionInterface {
    // Implementation...
}

public class SomeException2 extends Exception implements SomeExceptionInterface {
    // Implementation...
}

【讨论】:

    【解决方案2】:

    如果您需要访问名为a() 的方法,则需要提供该方法的类型。一个简单的解决方案可能是:

    public class AbstractSubException extends Exception {
        public abstract void a();
    }
    
    public class SubException1 extends AbstractSubException {
        @Override public void a() { ... }
    }
    
    public class SubException2 extends AbstractSubException {
        @Override public void a() { ... }
    }
    

    然后你可以捕捉到你做的方式或(有点简单):

    catch (AbstractSubException e) {
        e.a();
    }
    

    可能a 方法的代码在所有子类中都相同。然后就可以具体化,把代码放到父类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2013-08-11
      相关资源
      最近更新 更多