美文网首页
关于java异常try catch finally的一道题

关于java异常try catch finally的一道题

作者: crudnoob | 来源:发表于2018-12-26 21:50 被阅读0次

    这两天,有人咨询我一道关于java基础的题,具体代码如下:

    private static int m1() {

    int a = 10;

    try {

    a = 20;

    throw new RuntimeException();

    } catch (Exception e) {

    a = 30;

    return a;

    } finally {

    a = 40;

    }

    }

    ---------------------

    他问我这个方法的返回结果是多少?finally代码块不是一定会执行的吗?a不是赋值了40?为什么a返回的是30?

    我说返回30,具体为什么是30呢?,为了更有说服力,我把上面代码的class进行反编译,得到如下代码:

    private static int m1(){

    int a = 10;

    try {

          a = 20;

          throw new RuntimeException();

        } catch (Exception e){

          e = e;

          a = 30;

          int i = a;

          a = 40;return i;

        } finally {

          localObject = finally;

          a = 40;

          throw ((Throwable)localObject);

          }

    }

    ---------------------

    我们看第9和第10两行代码,心里是否已经有了答案?之所以结果是30是因为return返回的是i,而i是由a赋值30后赋值给的i。

    总结:首先a初始化赋值为10,接着a重新赋值为了20,然后throw抛出异常catch被执行,所以a再次被赋值为30,接着把a赋值给i,所以i为30。当return的时候本来应该是直接返回i的,但是程序还要执行finally代码块,所以程序把i先放到暂存。最后虽然a被赋值为了40,但是程序返回的是i(30)。

    相关文章

      网友评论

          本文标题:关于java异常try catch finally的一道题

          本文链接:https://www.haomeiwen.com/subject/jiizkqtx.html