前言:在网络上看到一篇《深入理解Java异常处理机制》,看完感觉自己也有一点小想法,的确在很多Java学者的眼里,异常处理机制不就是try catch finally吗,有啥好理解,很多时候,我也经常忽略这方面的内容,感觉没什么有意思的,那么我们来扎个小马步吧。
1.经过对原作者的例子改造
package mwq; public class T1 { public static void main(String[] args) { boolean b = true; try { b = tb1(); } catch (ArithmeticException e) { System.out.println("main catch the value of b : " + b); b = false; throw e; } finally { System.out.println("main finally b : " + b); } } public static boolean tb1() throws ArithmeticException { boolean b = true; try { if (!tb2()) { return false; } } catch (ArithmeticException e) { System.out.println("tb1 catch the value of b : " + b); b = false; throw e; } finally { System.out.println("tb1 finally b : " + b); } return b; } @SuppressWarnings("finally") public static boolean tb2() throws ArithmeticException { boolean b = true; try { System.out.println(1 / 0); } catch (ArithmeticException e) { System.out.println("tb2 catch the value of b : " + b); b = false; throw e; } finally { System.out.println("tb2 finally b : " + b); return b; } } }2.我自己感觉有意思的例子
package mwq; public class T { public static void main(String[] args) { try { System.out.println(1 / 0); System.out.println("ccccccccccccccccccc"); } catch (ArithmeticException e) { System.out.println(1 / 0); System.out.println("aaaaaaaaaaaaaaaaaaa"); } finally { System.out.println(1 / 0); System.out.println("bbbbbbbbbbbbbbbb"); } } }第一个例子就不多讲了,如果你的答案如下
tb2 catch the value of b : true tb2 finally b : false tb1 finally b : true main finally b : false那么,你就不需要你就可以不看原作者的例子了,不过可以读读他那么基础的理论知识。
对于第二个例子,在很多实际的应用中用到的很多,正常流程中,就如try语句,大多数情况下,我们很自觉的加上对应的catch语句,至少是catch Exception,那么这个是没有问题,但是很多时候,我们的catch语句中也有一些逻辑处理,并非简单的输出错误日志,假如我们在catch中再出现错误时,很多时候,catch中我们多数认为是正常的代码,于是我们不再对catch中语句进行catch捕获,那么按照上面的例子,你的答案是这样的吗?
Exception in thread "main" java.lang.ArithmeticException: / by zero at mwq.T.main(T.java:13)
package mwq; public class T { public static void main(String[] args) { try { System.out.println(1 / 0); System.out.println("ccccccccccccccccccc"); } catch (ArithmeticException e) { System.out.println(1 / 0); System.out.println("aaaaaaaaaaaaaaaaaaa"); } finally { System.out.println("bbbbbbbbbbbbbbbb"); } } }那么此时你认为结果会是怎样呢,结果有两种
bbbbbbbbbbbbbbbb Exception in thread "main" java.lang.ArithmeticException: / by zero at mwq.T.main(T.java:10)
Exception in thread "main" java.lang.ArithmeticException: / by zero at mwq.T.main(T.java:10) bbbbbbbbbbbbbbbb为什么会有两种结果呢,大多数情况下,都会先输出bbbbbbbbbbbbbbbbb,然而由于out对象也是输入输出流,JVM在进行处理的时候,少数情况下会将错误信息先打印出来,而后再将out对象的bbbbbbbbbbbbbbb输出出来,这可能是线程调度的原因,但是请小伙伴们怀疑我这种结论,因为我并没有证明是这种情况。
总结:总体而言,我感觉Java异常处理机制是很有意思,而不简单。