scjp子类抛出ioexception

brgchamk  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(326)
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"); }
 }
}

这个问题来自scjp6,书中说编译将由于第23行的错误而失败。但我学到的是,当您从父类溢出方法时,不能抛出更广泛的异常。在本例中,父类方法不抛出异常,而ovriden方法抛出ioexception,ioexception是exception的子类。那为什么不起作用呢?
此外,我正在考虑,如果我的父类方法没有抛出异常,那么它的默认值将被视为 (( public void process() throws Exception. )) . 是真的吗??

ippsafx7

ippsafx71#

是的,您必须有一个由类a的进程方法引发的异常
异常必须比类b的异常更为边界
这是强制性的,因为在 polymorphism 如果

A obj=new B();

now  

obj.process()

不会强制处理异常,但被调用的方法实际抛出异常
所以在子类中重写的方法可以抛出异常,但优先级比父类方法低

yhqotfr8

yhqotfr82#

你的理解不正确

public void process(){}

public void process() throws Exception{}

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

public void process() throws RuntimeException{}

根据定义,您不能从子类中重写的方法引发更广泛的异常。但是你可以从任何方法中抛出一个未检查的异常。
为了更好地理解,请阅读

djmepvbi

djmepvbi3#

此外,我考虑的是,如果父类方法不抛出异常,则默认情况下它被视为((public void process()throws exception.))。是真的吗??
这不是真的。必须声明方法抛出的每个选中异常,无论它是在类(具体的还是抽象的)还是在接口中。
但是,您仍然可以抛出未检查的异常和/或错误(即, RuntimeException 以及子类, Error 和子类)的方法,而不是声明抛出任何异常(尽管您确实应该避免抛出异常) Error 是的。
有关更多详细信息,请参阅java语言规范第11.2节。本节开头部分(重点):
java编程语言要求程序包含检查异常的处理程序,这些异常可能由方法或构造函数的执行引起。对于每个检查的异常(可能的结果),方法的throws子句(§8.4.6)或建造商(§8.8.5)必须提及该异常的类或该异常的类的超类之一(§11.2.3).

相关问题