研究简单异常的时候遇到了这样二个问题,各位帮忙分析,
第一题:
- Java code
public int method(){ try{ File f = new File(""); FileInputStream fi = new FileInputStream(f); return 1; }catch (Exception e) { // TODO: handle exception throw new Exception(); }finally{ System.out.println("1"); return 2; } }
这道题catch中抛出了异常,按照常理应该在catch里面继续try{}catch(){}捕获异常。否则就会出现编译错误。
而如果我在finally中写上retrun 那么编译就不会出错了。搞不清楚是什么原因。
第二题:
- Java code
public class ExceptionTest { public static void main(String[] args) { try { method(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ System.out.println("finally main"); } } public static void method() throws Exception { try{ throw new Exception(); }finally{ System.out.println("finally method"); } }}
这道题按照我最初的想法,首先执行method抛出异常然后执行finally输出"finally method",由于该方法采取躲避异常方式,所以main方法抓到异常,打印异常信息,输出"finally main"。
结果应该为:
finally method
java.lang.Exception
at bg.ExceptionTest.method(ExceptionTest.java:28)
at bg.ExceptionTest.main(ExceptionTest.java:17)
finally main
但是实际情况却不是这样,实际的结果可能有很多种
其中一种:
finally method
finally main
java.lang.Exception
at bg.ExceptionTest.method(ExceptionTest.java:28)
at bg.ExceptionTest.main(ExceptionTest.java:17)
其中一种:
finally method
java.lang.Exception
at bg.ExceptionTest.method(ExceptionTest.java:28)
at bg.ExceptionTest.main(ExceptionTest.java:17)
finally main
其中一种:
java.lang.Exception
at bg.ExceptionTest.method(ExceptionTest.java:28)
at bg.ExceptionTest.main(ExceptionTest.java:17)
finally method
finally main
(我跑了断点居然和线程有关,网上也没搜到有用的结论)。
忘有知道结果的大牛给出相关解释,学习一下!
------解决方案--------------------
第一道跟 返回值 有关系,你试试void再理解下。
第二道不知道,结果无序的。
------解决方案--------------------
返回值有返回不线程就结束了,就不执行了,所以必须在要执行的finally语句后面带return