3

我正在让我的 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);
}

乙是

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

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

4

3 回答 3

0

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

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

因此。

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

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

于 2013-11-05T19:23:46.660 回答
0

当您说 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();
}
}
于 2013-11-05T19:26:41.453 回答
0

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

于 2013-11-05T20:07:43.277 回答