由Java异常引起的程序中断实验(转载)

 

 

先上一张Java异常体系的图,其中蓝色部分是无需程序员手动 try catch的异常,JVM会自动做处理,通常也是比较严重的异常,会引起程序中断。Error则是程序无能为力的异常,是JVM层面的问题。

Java异常体系
下面写一组抛出各类异常的测试代码

 1 package exception;
 2 
 3 import java.io.IOException;
 4 
 5 public class Main {
 6      //无需进行try catch,由jvm自行抛出并捕获
 7     public void test1() throws RuntimeException {
 8         throw new RuntimeException("test1:Runtime");
 9     }
10 
11     public void test2() throws Exception{
12         throw new Exception("test2:Exception");
13     }
14 
15     public void test3() throws IOException{
16         throw new IOException("test3:IOException");
17     }
18 
19     public void test4() throws Throwable{
20         throw new Throwable("test4:Throwable");
21     }
22 
23     //严重错误,无需进行try catch,由jvm做处理
24     public void test5() throws Error{
25         throw new Error("test5:Error");
26     }
27 
28     public static void main(String[] args){
29         Main main = new Main();
30 
31         main.test1();//Runtime如果不做处理会导致程序中断
32         main.test5();//Error如果不做处理可能使jvm直接挂掉,被称为“程序终结者”
33 
34         try {
35             main.test2();
36         }catch(Exception e){
37             e.printStackTrace();
38         }
39 
40         try {
41             main.test3();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45 
46         try {
47             main.test4();
48         } catch (Throwable e) {
49             throw new IllegalArgumentException(e); //异常转换
50         }
51 
52     }
53 }

运行结果如下:

Exception in thread “main” java.lang.RuntimeException: test1:Runtime
at exception.Main.test1(Main.java:8)
at exception.Main.main(Main.java:31)

程序在test1()执行完毕之后即中断执行,也就是RuntimeException被抛出之后。

有趣的是,如果将RuntimeException和Error都用try catch包起来的话:

 1     public static void main(String[] args){
 2         Main main = new Main();
 3         
 4         try {
 5             main.test1();//Runtime如果不做处理会导致程序中断
 6         }catch (RuntimeException e){
 7             e.printStackTrace();
 8         }
 9 
10         try{
11             main.test5();//Error如果不做处理可以使jvm直接挂掉,被称为“程序终结者”
12         }catch (Error e){
13             e.printStackTrace();
14         }
15         
16         try {
17             main.test2();
18         }catch(Exception e){
19             e.printStackTrace();
20         }
21 
22         try {
23             main.test3();
24         } catch (IOException e) {
25             e.printStackTrace();
26         }
27 
28         try {
29             main.test4();
30         } catch (Throwable e) {
31             throw new IllegalArgumentException(e); //异常转换
32         }
33     }

结果为:

java.lang.RuntimeException: test1:Runtime
at exception.Main.test1(Main.java:8)
at exception.Main.main(Main.java:32)
java.lang.Error: test5:Error
at exception.Main.test5(Main.java:25)
at exception.Main.main(Main.java:38)
java.lang.Exception: test2:Exception
at exception.Main.test2(Main.java:12)
at exception.Main.main(Main.java:44)
java.io.IOException: test3:IOException
at exception.Main.test3(Main.java:16)
at exception.Main.main(Main.java:50)
Exception in thread “main” java.lang.IllegalArgumentException: java.lang.Throwable: test4:Throwable
at exception.ExceptionDemo.main(ExceptionDemo.java:58)
Caused by: java.lang.Throwable: test4:Throwable
at exception.ExceptionDemo.test4(ExceptionDemo.java:20)
at exception.ExceptionDemo.main(ExceptionDemo.java:56)

程序竟然顺利执行下去了,连Error都没有产生中断(感觉有点可怕……),可见Error和RuntimeException只有在没有被try catch的情况下才会引起程序中断,只要主动捕获依然能够继续运行。也说明RuntimeException和Error只有在由JVM捕获之后才会对程序的行进产生影响。


————————————————
版权声明:本文为CSDN博主「仗键纵码走天涯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/slg1988/article/details/86686822


————————————————
版权声明:本文为CSDN博主「仗键纵码走天涯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/slg1988/article/details/86686822

posted @ 2020-04-19 20:52  日程百行  阅读(304)  评论(0)    收藏  举报