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子句中抛出什么类型的已检查异常

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关于超类型,它是明确指定的还是什么?引用中没有说明这些异常类之间的关系。我的意思是,通常我们不需要是一个超级类型,引用中没有提到这些异常类之间的关系。我的意思是,通常我们不需要是超级类型。