【问题标题】:Java exceptions derivationJava 异常派生
【发布时间】:2013-11-05 19:17:35
【问题描述】:

我正在让我的 foo 方法抛出异常 A,如下所示

void foo() throws A {
    ....
    throw new A();
}

有一个预先存在的函数 bar() 调用 foo,bar 最初抛出异常 B,它是 A 的超类,如中

void bar() throws B {
    foo();
    throw new B();
}

问题是在 foo() 中添加 throw new A 后,编译器正在抄袭我声明 那 bar() 也抛出了 A。这不是从 A 扩展 B 的事实中隐含的吗?除了在 bar() 的 throws 子句中添加 A 之外,还有什么解决方法?

编辑:

一个是

public class A  extends B {
    private complex-type type;
    public A(String message);
    public A(complex-type type);
}

B 是

public class B extends C {
    public B(String message);
}

我认为 A 的构造函数没有超级调用。会不会是这个原因?

【问题讨论】:

  • 你说得对,这应该可以。那一定意味着你的代码不是这样的。您可以发布实际代码的(精简版)版本吗?使用异常和方法的实际声明?
  • 能否请您出示您对AB 的异常声明?
  • 这是因为B 在您的实际 代码中不是 A 的超类。您的相似代码编译没有错误 (link)。
  • 犯了一个蹩脚的错误。将其发布为答案:(

标签: java exception


【解决方案1】:

如果您从功能栏中删除 throws B。默认操作是重新抛出 foo() 中生成的异常。

你可以在 foo() 的调用者中捕获这个异常。 Foo 本身当然也可以像您的情况一样抛出异常。在这种情况下,您必须在 throw 子句中添加 A

因此。

void bar() throws A, B {
    foo();
    throw new B();
}

如果 A 和 B 都扩展 Throwable 类或实现 Exception 接口,您也可以简单地抛出 Exception

【讨论】:

    【解决方案2】:

    当您说 A 扩展 B 时,我认为您交换了 A 和 B。您的示例编译得很好:

    public class Tmp { 
    
    static class B extends Exception {
    }
    
    static class A extends B {
    }
    
    void foo() throws A {
        throw new A();
    }
    
    void bar() throws B {
        foo();
        throw new B();
    }
    }
    

    【讨论】:

      【解决方案3】:

      对不起,伙计们犯了一个非常非常蹩脚的错误。在那个包中发生了 2 次 foo() 调用,我正在查看错误的发生。非常感谢,对不起!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 2015-10-06
        • 1970-01-01
        相关资源
        最近更新 更多