解决java try throw exception finally遇上return break continue造成异常丢失
作者:luffy5459
这篇文章主要介绍了解决java try throw exception finally遇上return break continue造成异常丢失问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
如下所示
是一个java笔试题
考察的是抛出异常之后,程序运行结果,但是这里抛出异常,并没有捕获异常,而是通过finally来进行了流程控制处理。
package com.xxx.test; public class ExceptionFlow { public static void main(String[] args) { try { System.out.println("hello " + func()); } catch (Exception e) { e.printStackTrace(); } } public static int func() { int a = 0; for (int i = 0; i < 3; i++) { try { throw new RuntimeException("xx"); } finally { continue; } } return a; } }
运行程序,打印结果如下所示:
这里结果有些出人意料,并没有打印异常信息,其实就是try finally遇到了continue,导致异常信息丢失。
如果这里,我们稍微改变一下,把finally中的continue注释,
再来看看结果:
这次打印了异常信息。
下面再来看看另一个例子
package com.xxx.test; public class ExceptionDemo { public static void main(String[] args) { try { func(); System.out.println("A"); } catch (Exception e) { System.out.println("C"); } System.out.println("D"); } public static void func() { try { throw new Exception(); } finally { System.out.println("B"); } } }
这里要求写出程序运行结果。
这道题的答案其实就是编译不通过,
如下所示:
这里需要在func方法签名上声明抛出异常。
方法签名上添加了抛出异常,这里就编译成功,运行结果是B C D。
这里其实也可以不用在方法签名上进行声明,直接把异常改成自定义异常RuntimeException("xx"),最终程序运行结果也是一样的。
这里我们按照第一个题目的思路,把finally中添加return信息,这时候,运行结果会变为B A D。
因为异常信息丢失,所以在调用func()的地方,进行try catch的时候,就不会有异常信息,那么程序就会按照正常的流程运行。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。