8.4.8.3
子句中的JLS提到了有关包含throws
子句的覆盖方法,但目前还不清楚他们试图用什么来表达:
更确切地说,假设B是类或接口,A是a B的超类或超接口,以及B中的方法声明m2 覆盖或隐藏A中的方法声明m1。然后:
- 如果m2有一个throws子句,提到任何已检查的异常类型, 那么m1必须有一个throws子句,否则就会发生编译时错误。
什么类型的已检查异常m2
应放入其throws
子句?
答案 0 :(得分:3)
代码中的示例:
class B implements A {
@Override
void m() throws SomeException {
/* ... */
}
}
什么是不允许的:
interface A {
void m(); // This is not allowed
}
允许什么:
interface A {
void m() throws SomeException;
}
甚至:
interface A {
void m() throws Exception;
}
编辑:
你引用的第二个要点:
- 对于m2的throws子句中列出的每个已检查异常类型, 必须出现相同的异常类或其中一个超类型 m1的throws子句的擦除(§4.6);否则,编译时 发生错误。
答案 1 :(得分:1)
它说,如果你的子类抛出检查异常,那么父进程不会导致编译时错误。
考虑一下:
class A {
public void testMethod() {}
}
class B extends A {
public void testMethod() throws FilNotFoundException {}
}
这会抛出编译时错误。进一步说,要解决这个问题,你可能需要父方法来抛出FileNotFoundException。
答案 2 :(得分:0)
什么类型的已检查异常m2应该抛出其throws子句?
m2
只能throws
超类中重写方法的throws子句中的全部或部分异常类。
例如:
class Base
{
void amethod() { }
}
class Derv extends Base
{
void amethod() throws Exception { } //compile-time error
}