11.classA {
12. public void process() { System.out.print(”A,”); } }
13. class B extends A {
14. public void process() throws IOException {
15. super.process();
16. System.out.print(”B,”);
17. throw new IOException();
18. } }
19. public static void main(String[] args) {
20. try { new B().process(); }
21. catch (IOException e) { System.out.println(”Exception”); } }
What is the result?
A. Exception
B. A,B,Exception
C. Compilation fails because of an error in line 20.
D. Compilation fails because of an error in line 14.
E. A NullPointerException is thrown at runtime.
Answer: DGiven:
11.classA {
12. public void process() { System.out.print(”A “); } }
13. class B extends A {
14. public void process() throws RuntimeException {
15. super.process();
16. if (true) throw new RuntimeException();
17. System.out.print(“B”); }}
18. public static void main(String[] args) {
19. try { ((A)new B()).process(); }
20. catch (Exception e) { System.out.print(”Exception “); }
21. }
What is the result?
A. Exception
B. A Exception
C. A Exception B
D. A B Exception
E. Compilation fails because of an error in line 14.
F. Compilation fails because of an error in line 19.
Answer: B代码1中由于14行子类无法重写父类的方法所以报错~~
   想问一下代码2为什么不报错,顺便帮我讲解一下原因。谢谢~~~

解决方案 »

  1.   

    这2个代码我在本机上跑的时候IOException需要导入包import java.io.IOException;
    而RuntimeException就不需要导入包,应该是属于java.lang.RuntimeException
    在查文档的时候看到一些:RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 
    可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。 
    public class IOExceptionextends Exception当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。
      

  2.   

    原因:由于在做函数重写时,重写的函数不能抛出比重写函数更多的异常。
    这里的异常是checked异常,而RuntimeException以及其子类属于unchecked异常,虚拟机在编译时不会去检测
      

  3.   

    补充,虽然在程序编译期间RuntimeException不会被检测,但是在运行期间还是可以被捕获到的~
      

  4.   


    由于是RuntimeException,所以虚拟机在编译期间不会去检测