异常链如何在我的代码中工作?
How does exception chain work in my code?
为什么此代码不打印 "d"。为什么它不转到 RunTimeException 的 catch 块?
public static void main(String[] args) {
System.out.println("a");
try {
System.out.println("b");
throw new IllegalArgumentException();
} catch (IllegalArgumentException e) {
System.out.println("c");
throw new RuntimeException();
}catch (RuntimeException e) {
System.out.println("d");
throw new RuntimeException();
}finally{
System.out.println("e");
throw new RuntimeException();
}
}
这个程序的输出是
a
b
c
e
Exception in thread "main" java.lang.RuntimeException
编辑:抛出 IllegalArgumentException 后,它会转到相应的 catch 块并打印 'c'。在那之后,因为我们没有在 RuntimeException 中捕获异常,所以它不会再继续了。但是因为它保证我们去 finally 块它打印 'e' 然后抛出 RunttimeException。如果代码如下所示,它会抛出 RuntimeException("2")。如果我们最后在里面注释异常,它会抛出RuntimeException("1")。
public static void main(String[] args) throws InterruptedException {
System.out.println("a");
try {
System.out.println("b");
throw new IllegalArgumentException();
} catch (IllegalArgumentException e) {
System.out.println("c");
throw new RuntimeException("1");
}catch (RuntimeException e) {
System.out.println("d");
throw new RuntimeException();
}finally{
System.out.println("e");
throw new RuntimeException("2");
}
}
catch
块不在 try
的范围内。 catch
块中的任何代码都在外部 main
代码的上下文中执行,因此没有异常处理程序。当你抛出 RuntimeException
时,try 的 finally
块被执行,然后异常终止程序。
这段代码不打印 d 的原因是,因为在 IllegalArgumentException 捕获块中,在打印 "c" 之后和抛出 RuntimeException 之前它最终执行(这就是流程的工作方式)。最后块自己抛出异常,所以它永远不会抛出将它带到 "d".
的 RuntimeException
public static void main(String[] args) {
System.out.println("a");
try {
System.out.println("b"); // 1
throw new IllegalArgumentException(); // 2
} catch (IllegalArgumentException e) {
System.out.println("c"); // 3
throw new RuntimeException(); // nope, there's a finally block that executes first
}catch (RuntimeException e) {
System.out.println("d");
throw new RuntimeException();
}finally{
System.out.println("e"); // 4
throw new RuntimeException(); // 5 - rest of the code never got executed.
}
}
希望这已经足够清楚了。
另外,正如所指出的,即使在"c"之后的RuntimeException被执行,它也不会调用下层的catch块。 catch 块仅被调用一次,具体取决于 try 块中抛出的异常(尽管这并不真正相关,因为第一个解释决定了线程的流程)。
在 try catch 块中,如果其中一个 catch 块捕获了异常,则其他 catch 不参与。请记住,无论是否抛出异常,最后总是 运行 阻塞。
为什么此代码不打印 "d"。为什么它不转到 RunTimeException 的 catch 块?
public static void main(String[] args) {
System.out.println("a");
try {
System.out.println("b");
throw new IllegalArgumentException();
} catch (IllegalArgumentException e) {
System.out.println("c");
throw new RuntimeException();
}catch (RuntimeException e) {
System.out.println("d");
throw new RuntimeException();
}finally{
System.out.println("e");
throw new RuntimeException();
}
}
这个程序的输出是
a
b
c
e
Exception in thread "main" java.lang.RuntimeException
编辑:抛出 IllegalArgumentException 后,它会转到相应的 catch 块并打印 'c'。在那之后,因为我们没有在 RuntimeException 中捕获异常,所以它不会再继续了。但是因为它保证我们去 finally 块它打印 'e' 然后抛出 RunttimeException。如果代码如下所示,它会抛出 RuntimeException("2")。如果我们最后在里面注释异常,它会抛出RuntimeException("1")。
public static void main(String[] args) throws InterruptedException {
System.out.println("a");
try {
System.out.println("b");
throw new IllegalArgumentException();
} catch (IllegalArgumentException e) {
System.out.println("c");
throw new RuntimeException("1");
}catch (RuntimeException e) {
System.out.println("d");
throw new RuntimeException();
}finally{
System.out.println("e");
throw new RuntimeException("2");
}
}
catch
块不在 try
的范围内。 catch
块中的任何代码都在外部 main
代码的上下文中执行,因此没有异常处理程序。当你抛出 RuntimeException
时,try 的 finally
块被执行,然后异常终止程序。
这段代码不打印 d 的原因是,因为在 IllegalArgumentException 捕获块中,在打印 "c" 之后和抛出 RuntimeException 之前它最终执行(这就是流程的工作方式)。最后块自己抛出异常,所以它永远不会抛出将它带到 "d".
的 RuntimeExceptionpublic static void main(String[] args) {
System.out.println("a");
try {
System.out.println("b"); // 1
throw new IllegalArgumentException(); // 2
} catch (IllegalArgumentException e) {
System.out.println("c"); // 3
throw new RuntimeException(); // nope, there's a finally block that executes first
}catch (RuntimeException e) {
System.out.println("d");
throw new RuntimeException();
}finally{
System.out.println("e"); // 4
throw new RuntimeException(); // 5 - rest of the code never got executed.
}
}
希望这已经足够清楚了。
另外,正如所指出的,即使在"c"之后的RuntimeException被执行,它也不会调用下层的catch块。 catch 块仅被调用一次,具体取决于 try 块中抛出的异常(尽管这并不真正相关,因为第一个解释决定了线程的流程)。
在 try catch 块中,如果其中一个 catch 块捕获了异常,则其他 catch 不参与。请记住,无论是否抛出异常,最后总是 运行 阻塞。