工作时,一直对try块中throw的异常对象,在catch中如何处理此异常,以及trycatchfinally完毕,程序是否就此停止还是继续运行很迷惑,于是参考网上的资料,自己写了些demo,去慢慢探索。
例1.
1 public static void main(String[] args) { 2 int i = 7; 3 int j = 0; 4 try { 5 if (j == 0) 6 throw new ArithmeticException(); 7 System.out.println("打印计算结果i/j=" + i / j); 8 } 9 catch (ArithmeticException e) { 10 System.out.println("被除数j不能等于0"); 11 } 12 System.out.println("运行结束"); 13 }
run:
被除数j不能等于0
运行结束
结论:可以看到,当try块中创建 ArithmeticException异常对象,并由throw语句将异常抛给Java运行时系统,由系统寻找匹配的异常处理器catch并运行相应异常处理代码,打印 "被除数j不能等于0",然后trycatch块结束,程序继续运行,打印"运行结束".可以看到,throw 异常对象,程序并未结束,而是继续执行。另外,我们在catch块中用输出语句打印信息,并不能很全面,直观,专业的把异常信息给显示出来。
例2.
1 public static void main(String[] args) { 2 int i = 7; 3 int j = 0; 4 try { 5 if (j == 0) 6 throw new ArithmeticException(); 7 System.out.println("打印计算结果i/j=" + i / j); 8 } 9 catch (ArithmeticException e) { 10 e.printStackTrace(); 11 } 12 System.out.println("运行结束"); 13 }
run:
java.lang.ArithmeticException
at com.westward.Demo4.main(Demo4.java:9)
运行结束
结论:通过catch块中,调用异常对象ArithmeticException的printStackTrace()方法,能够将对应的异常信息打印出来,trycatch块下面的程序继续执行。
例3.
如果我们想在try块中,j==0时,程序抛出异常,并且程序中断,可以继续看下面的demo。
1 public static void main(String[] args) { 2 int i = 7; 3 int j = 0; 4 try { 5 if (j == 0) 6 throw new ArithmeticException(); 7 System.out.println("打印计算结果i/j=" + i / j); 8 } 9 catch (ArithmeticException e) { 10 throw e; 11 } 12 System.out.println("运行结束"); 13 }
run:
Exception in thread "main" java.lang.ArithmeticException
at com.westward.Demo4.main(Demo4.java:9)
结论:通过运行结果,我们可以看到,在catch块中throw ArithmeticException对象后,throw语句将异常抛给Java运行时系统,由系统寻找匹配的异常处理器catch,由于未找到相应的异常处理器catch(没有catch或者有catch,但是类型不符合),所以异常最后抛给了jvm,并在后台打印异常信息,程序在此中断,trycatchfinally下面的程序代码不在执行。
附加:事实上,ArithmeticException为RuntimeException(运行时异常,不可查异常)的子类。而运行时异常将由运行时系统自动抛出,不需要程序员使用throw语句显示抛出。
trycatch之catch对捕获异常的处理及后续代码的执行的探索
原文:http://www.cnblogs.com/westward/p/5164952.html