当前位置: 代码迷 >> J2SE >> J2SE关于几个特殊的错误情况的疑问
  详细解决方案

J2SE关于几个特殊的错误情况的疑问

热度:19   发布时间:2016-04-24 01:14:48.0
J2SE关于几个特殊的异常情况的疑问!
研究简单异常的时候遇到了这样二个问题,各位帮忙分析,
第一题:
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