java中的异常重新触发

java中的异常重新触发,java,exception-handling,Java,Exception Handling,我在准备OCA时遇到一个练习,我不明白为什么程序会打印:abce 3而不是abcde 3。以下是节目: 'public static void main(String[] args) { System.out.print("a"); try{ System.out.print("b"); throw new IllegalArgumentException(); }catch(IllegalA

我在准备OCA时遇到一个练习,我不明白为什么程序会打印:
abce 3
而不是
abcde 3
。以下是节目:

'public static void main(String[] args) {
        System.out.print("a");
         try{
            System.out.print("b");
             throw new IllegalArgumentException();
          }catch(IllegalArgumentException e){
              System.out.print("c");
              throw new RuntimeException("1");
          }catch(RuntimeException e) {
              System.out.print("d");
              throw new RuntimeException("2");
          }finally {
            System.out.print("e");
            throw new RuntimeException("3");
          }
        }'

任何关于它为什么忽略最后一个捕捉块的解释都将非常感谢

A
finally
块总是在
try catch
块之后执行,因此打印
e
abc
是显而易见的,因为您在
try
中抛出异常,并且输入了
IllegalArgumentException
对应的
catch


但是,由于您在catch块内抛出一个新的异常
RuntimeException
,因此它被抛出给方法的调用方。
catch
仅处理
try
块中抛出的异常,所有其他异常都传递给抛出异常的函数的调用方。

a
最后
块总是在
try catch
块之后执行,因此打印
e
abc
是显而易见的,因为您在
try
中抛出异常,并且输入了
IllegalArgumentException
对应的
catch


但是,由于您在catch块内抛出一个新的异常
RuntimeException
,因此它被抛出给方法的调用方。
catch
仅处理
try
块中抛出的异常,所有其他异常都传递给抛出异常的函数的调用方。

另一个问题是,最后一个catch块中抛出的异常被最后一个块中抛出的异常忽略或掩盖。是的,这是一个问题,但这是Java内置的一个问题:)不要从finally块抛出异常。
另一个问题是,在最后一个catch块中抛出的异常被finally块中抛出的异常忽略或掩盖。是的,这是一个问题,但这是Java内置的问题:)不要从finally块抛出异常。