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

下面写一组抛出各类异常的测试代码
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

浙公网安备 33010602011771号