Scjp子类抛出IOException

时间:2014-03-11 16:21:28

标签: java scjp

class A {
             public void process() { System.out.print("A,"); }
         }
public class B extends A
         {
             public void process() throws IOException  {   //LINE 23
             super.process();
             System.out.print("B,");
             throw new IOException();
          }

 public static void main(String[] args) {

 try { new B().process(); }

 catch (IOException e) { System.out.println("Exception"); }
 }
}

这个问题来自SCJP 6,书中说由于第23行的错误导致编译失败。但我学到的是,当你从父类中覆盖方法时,你不能抛出更广泛的异常。在此示例中,我的父类方法不会抛出异常,并且我的ovridden方法抛出IOException,它是Exception的子类。那它为什么不起作用呢?

此外,我正在考虑如果我的父类方法不抛出任何异常,则默认情况下将其视为(( public void process() throws Exception. ))。那是真的吗?

3 个答案:

答案 0 :(得分:0)

  

此外,我正在考虑如果我的父类方法不抛出任何异常,则默认情况下将其视为((public void process()抛出异常。))。那是真的吗?

事实并非如此。您必须声明方法抛出的每个已检查异常,无论它是在类(具体还是抽象)还是在接口中。

但是,您可以仍然从未声明抛出任何异常的方法中抛出未经检查的异常和/或错误(即RuntimeException和子类,Error和子类)(虽然你真的应该避免抛出Error

有关详细信息,请参阅the Java language specification, section 11.2。本节的开头是(强调我的):

  

Java编程语言要求程序包含已检查异常的处理程序,这可能是由于执行方法或构造函数而导致的。对于每个可能结果的已检查异常,方法(第8.4.6节)或构造函数(第8.8.5节)的throws子句必须提及该异常的类或该异常类的一个超类(§ 11.2.3)。

答案 1 :(得分:0)

您的理解不正确

public void process(){}

public void process() throws Exception{}

不等同。你能说的是等价的:

public void process() throws RuntimeException{}

根据定义,您不能从子类中的重写方法抛出更广泛的异常。但你总是可以从任何方法中抛出未经检查的异常。

为了更好地理解please read

答案 2 :(得分:0)

是的你必须抛出异常 A类的处理方法

,例外必须是边界,而不是B类例外

这是强制性的,因为polymorphism

如果

A obj=new B();

now  

obj.process()

不会被强制处理异常,但实际调用的方法会抛出异常

所以在子类重写方法中可以抛出异常,但优先级低于父类方法