这是我的代码:
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");
}
}
我无法理解为什么输出是abce
和RuntimeException(“3”)
答案 0 :(得分:3)
当您缩进代码时,这一点就变得清晰了:
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");
}
重点是:只有一个尝试块。然后采用第一个 catch块。那个抛出 - 而这个异常1就是你在堆栈跟踪中注意到的那个。
但事情是:最后块抛出异常1的“顶部”。因此,您会看到异常3。
换句话说:你的结局存在误解。您可能认为异常1应该被第二个 catch块捕获。那是错的。第二个阻止块仅涵盖第一个try块。含义:来自 catch 块的异常不会导致另一个 catch块被占用。第一个捕获块“触发”,最后一个块“触发” - 导致观察到的结果。
答案 1 :(得分:0)
虽然可以有多个catch()
块,但在抛出异常时最多会执行1 catch()
。之后它将执行finally
阻止,因此您有abce
的输出和RuntimeException
阻止{。}}。
答案 2 :(得分:0)
这是因为,在try块中抛出IllegalArgumentException之后,它会被捕获到相应的catch(IllegalArgumentException e){}块中。最后,无论异常如何执行块,都会打印出来。
对于你的问题,由于异常已经在catch块中被捕获,它将相应地抛出相应的异常,并且它将被传播到该方法的调用者。