核心-java异常处理

时间:2017-04-02 11:09:14

标签: java exception

下面是一个类问题,它传播异常处理机制,所需的输出是Exception。可以解释为什么输出是Exception,提前谢谢。

 Class Question {

  public void m1() throws Exception {

   try {

    m2();

   } finally {

    m3();

   }
  }
  public void m2() throws RuntimeException {

   throw new RuntimeException();

  }

  public void m3() throws Exception {

   throw new Exception();

  }
  public static void main(String[] args) throws Exception {

   Question q = new Question();

   try {

    q.m1();

   } catch (RuntimeException re) {

    System.out.println("RuntimeException");

   } catch (Exception e) {

    System.out.println("Exception");
   }
  } 

4 个答案:

答案 0 :(得分:1)

以下步骤作为程序执行的一部分发生:

(1)main()来电m1()

(2)m1()方法try阻止调用m2()抛出RuntimeException

(3) m1()方法finally阻止调用m3()抛出Exception

(4)Exception将被抛回调用方法main()

(5)在你的main()方法中Exception对象将被捕获并打印字符串“Exception”

关键是finally块始终执行,即使Exception(在您的代码中,try块抛出RuntimeException)抛出{{1}阻止。

  

如果在finally块中我调用m2()方法输出是什么?

在这种情况下,输出将是try

答案 1 :(得分:0)

  

所需的输出是异常。任何人都可以解释为什么输出   例外

因为finally是在try之后执行的最后一个块:

finally {
   m3();
}

为此,您获得Exception而非RuntimeException

答案 2 :(得分:0)

因为当执行finally语句时,会调用m3()并抛出Exception
因此,即使在finally语句到达之前RuntimeException上升,如果finally子句也引发另一个异常,则不会考虑RuntimeException

来自14.18. The throw Statement JLS

  

如果有任何封闭的try语句(§14.20),其try块   包含throw语句,然后是那些try的任何finally子句   当控件向外传输时,执行语句,直到   抛出的价值被捕获。 注意突然完成一个终于   子句可以破坏投掷引发的控制权转移   言。

答案 3 :(得分:0)

以下是此问题的程序执行: -

。第一个main()方法是调用m1()

。 m1()方法try块正在调用m2(),它抛出RuntimeException

。然后m1()方法finally块调用m3()抛出异常

。并且异常将被抛回main()(调用方法)

。在main()方法中,将捕获并打印异常。