Java Scjp子类引发IOException

Java Scjp子类引发IOException,java,scjp,Java,Scjp,这个问题来自SCJP6,书中说编译将由于第23行的错误而失败。但我学到的是,当您从父类越位方法时,不能抛出更广泛的异常。在这个例子中,我的父类方法不抛出异常,而我的ovridden方法抛出IOException,它是exception的子类。那为什么它不起作用呢 此外,我正在考虑,如果我的父类方法不抛出异常,那么默认情况下它被认为是((public void process()抛出异常。)。这是真的吗 此外,我正在考虑,如果我的父类方法不抛出异常,那么它的默认值将被视为((public void

这个问题来自SCJP6,书中说编译将由于第23行的错误而失败。但我学到的是,当您从父类越位方法时,不能抛出更广泛的异常。在这个例子中,我的父类方法不抛出异常,而我的ovridden方法抛出IOException,它是exception的子类。那为什么它不起作用呢

此外,我正在考虑,如果我的父类方法不抛出异常,那么默认情况下它被认为是
((public void process()抛出异常。)
。这是真的吗

此外,我正在考虑,如果我的父类方法不抛出异常,那么它的默认值将被视为((public void process()抛出异常)。这是真的吗

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

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

有关更多详细信息,请参阅。本节开头部分内容如下(重点):

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


你的理解不正确

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"); }
 }
}

它们并不等同。你可以说的是:

public void process() throws Exception{}
根据定义,您不能从子类中重写的方法引发更广泛的异常。但您始终可以从任何方法抛出未经检查的异常


为了更好地理解

是的,您必须让 A类工艺方法

和异常必须是B类异常的边界

这是强制性的,因为在
多态性的情况下

如果

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


所以在子类中,重写的方法可以抛出异常,但优先级比父类方法低。但即使我在类A中使用“public void process()抛出异常{}”。程序未编译是的,因为在调用super.process()时,它将与IOException不兼容
public void process() throws Exception{}
public void process() throws RuntimeException{}
A obj=new B();

now  

obj.process()