java中的异常重新触发
我在准备OCA时遇到一个练习,我不明白为什么程序会打印: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
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块抛出异常。