Java异常和抛出子句
在其Java异常和抛出子句,java,exception,Java,Exception,在其8.4.8.3子句中,提到了覆盖包含throws子句的方法,但不清楚他们试图通过以下方式表达什么: 更准确地说,假设B是一个类或接口,a是一个 B的超类或超接口,以及B中的方法声明m2 重写或隐藏a中的方法声明m1。然后: 如果m2有一个throws子句,其中提到任何选中的异常类型, 那么m1必须有一个throws子句,否则会发生编译时错误 在它的throws子句中应该抛出什么类型的已检查异常m2?它说,如果您的子类抛出的是父类没有抛出的已检查异常,那么它将导致编译时错误 考虑这一点:
8.4.8.3
子句中,提到了覆盖包含throws
子句的方法,但不清楚他们试图通过以下方式表达什么:
更准确地说,假设B是一个类或接口,a是一个
B的超类或超接口,以及B中的方法声明m2
重写或隐藏a中的方法声明m1。然后:
- 如果m2有一个throws子句,其中提到任何选中的异常类型, 那么m1必须有一个throws子句,否则会发生编译时错误
在它的
throws
子句中应该抛出什么类型的已检查异常m2
?它说,如果您的子类抛出的是父类没有抛出的已检查异常,那么它将导致编译时错误
考虑这一点:
class A {
public void testMethod() {}
}
class B extends A {
public void testMethod() throws FilNotFoundException {}
}
这将引发编译时错误。进一步说,为了解决这个问题,您可能需要父类的方法抛出FileNotFoundException。它说,如果您的子类抛出的是父类没有抛出的checked exception,那么它将导致编译时错误 考虑这一点:
class A {
public void testMethod() {}
}
class B extends A {
public void testMethod() throws FilNotFoundException {}
}
这将引发编译时错误。进一步说,要解决这个问题,您可能需要父方法抛出FileNotFoundException。代码中的示例:
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的TROWS子句中列出的每个选中的异常类型, 相同的异常类或其超类型之一必须出现在 删除m1中的条款(§4.6);否则,编译时 发生错误
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的TROWS子句中列出的每个选中的异常类型, 相同的异常类或其超类型之一必须出现在 删除m1中的条款(§4.6);否则,编译时 发生错误
m2
只能抛出超类中重写方法的throws子句中的所有异常类或异常类的子集
例如:
class Base
{
void amethod() { }
}
class Derv extends Base
{
void amethod() throws Exception { } //compile-time error
}
m2应该在其throws子句中抛出什么类型的已检查异常
m2
只能抛出超类中重写方法的throws子句中的所有异常类或异常类的子集
例如:
class Base
{
void amethod() { }
}
class Derv extends Base
{
void amethod() throws Exception { } //compile-time error
}
相同或超级类型。它必须能够抛出在重写方法中声明的异常。@BoristheSpider关于超级类型,它是显式指定的还是什么?相同还是超级类型。它必须能够抛出在重写方法中声明的异常。@BoristheSpider关于超类型,它是明确指定的还是什么?引用中没有说明这些异常类之间的关系。我的意思是,通常我们不需要是一个超级类型,引用中没有提到这些异常类之间的关系。我的意思是,通常我们不需要是超级类型。