Scjp 子类抛出 IOException


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,它是异常的子类。那为什么它不起作用呢?

此外,我正在考虑如果我的父类方法没有抛出异常,则默认将其视为(( public void process() throws Exception. ))。这是真的吗??

你的理解不正确

public void process(){}

public void process() throws Exception{}

不等价。 你可以说等价的是:

public void process() throws RuntimeException{}

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

为了更好地理解,请阅读

此外,我正在考虑如果我的父类方法没有抛出异常,默认情况下它被认为是((公共无效进程()抛出异常。这是真的吗??

这不是真的。必须声明方法引发的每个已检查异常,无论它是在类(具体或抽象)中还是在接口中。

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

有关更多详细信息,请参阅 Java 语言规范第 11.2 节。本节的开头是(强调我的):

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

是的,你必须有一个异常 A类工艺方法

并且例外必须是边界而不是B类的例外

这是强制性的,因为如果出现polymorphism

如果

A obj=new B();
now  
obj.process()

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

所以在子类中被覆盖的方法可以抛出异常,但优先级较低,然后父类方法

最新更新