在论坛看到一个同学问到有关try...catch语句的相关问题,这个还是一个比较有趣的,原题如下
- public static void main(String[] args) {
- System.out.println(getInt());
- }
- private static int getInt() {
- int x = 10;
- try {
- x = 20;
- System.out.println(x / 0);
- x = 30;
- } catch (ArithmeticException e) {
- x = 40;
- return x; } finally {
- x = 50;
- }
- return x;
复制代码
他问结果是多少
这是一个try...catch有代表意义的题目,
这涉及到try...catch语句的执行顺序问题
-
- try{
- //1:抛出异常的代码
- //2:代码
- }catch(){
- //3:代码
- //4:抛出异常
- }finally{
- //5:代码
- }
- //6:代码
复制代码 首先finally语句,是不管try是否抛出异常,finally语句块都会执行
其次,这个语句执行顺序会有几种情况:
第一种大的情况:try语句块没有抛出异常,则程序会执行try,finally以及finally块之后的代码;
第二种大的情况:try语句块抛出了异常并且catch有匹配的异常。当遇到try里面抛出的异常后,try块里面剩下的代码就不执行了,跳转到catch块里面。
这里又可以分为2种情况。第一种,抛出的异常被后面的catch捕获,而catch又没有抛出新的异常,那么执行顺序是1,3,5,6 ;第二种,如果catch里面又抛出新的异常,顺序是1,3,4,5,然后将新的异常返回给方法调用者,6就不执行了;
第三种大的情况:try语句块抛出了异常,但是后面的catch没有能匹配的异常。那么会执行try和finally里面的语句也就是1,5,然后将该异常返回给方法调用者,不执行6 。
那么实例中
- System.out.println(x / 0);
复制代码 这一句将抛出异常,并且被catch捕获,并且在执行到catch时候将x重新赋值,并返回。而此时又涉及到在try..catch中使用return语句
如果在try语句中有return语句时,finally语句是在return语句前执行的,而且finally语句不能改变return的返回值,finally语句中不应含有return语句
所以分析之后,结果应该是40 个人理解,不当之处,请各位大神赐教
|