这是一个群友发的,还有点意思:
class Test{
public static void main(String[] args){
try{
throw new RuntimeException("try");
}finally{
throw new RuntimeException("finally");
}
}
}
上面的代码,最终会抛出哪个异常呢,为什么?
以后遇到类似问题,怎么看比较靠谱?
更多问答 >>
-
每日一问 | Activity 调用了finish()方法会立即调用onDestory()吗?
2020-05-13 00:16 -
2020-05-21 01:15
-
每日一问 | 我们常说的dalvik虚拟机是基于寄存器的,而jvm是基于栈,到底指的是什么?
2020-05-20 21:29 -
2020-05-25 23:08
-
每日一问 在 Java 支持了 switch(字符串)之后,只是语法糖而已?
2020-06-01 00:55 -
每日一问 “PathClassLoader 只能加载已安裝到系統中(即/data/app目录下)的apk文件” 严谨吗?
2020-05-05 20:46 -
每日一问 | “必须在UI线程才能更新控件/界面” 这句人人皆知的话,100%正确吗?
2020-04-29 01:14 -
2020-04-13 23:58
-
每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?
2020-04-08 23:58 -
每日一问 | 上周出现了大规模的github证书不可用的状态...但是真的是github服务器被攻击了么?
2020-04-01 21:49
运行可以看得出来,执行的是 finally:
这类考察代码执行顺序的,其实有一个万能的招数,就是查看字节码。
例如上面的代码,javap -v 一下:
对于异常,我们应该看啥呢?
看上面的 Exception Table:
什么意思呢?
就是从第 0 行(from),到 11 行(to 不包含 11),发生任何异常(any),都将程序定位都 第10 行继续执行(target=10)。
对应上面的指令,可以看到第 9 行 throw 的异常,所以程序回到第 10 行继续执行,一行一行,到 20 行,抛出 finally 异常终止。
我们改下代码会更有感觉:
上面这个代码,最终会抛出:
没看错,是 throw new RuntimeException("try");
javap -v 下:
你可以看到 Exception table 有两条记录了。
按照上面的分析,先执行到第 9 行抛出异常,转到第 10 行往下执行,一直到 20 行遇到错误,再转到 21 行继续执行,最后到 31 行抛出异常,这个异常注意,aload_1取出的是前面第 10行 astore_1的,对应是第 6 行 new RuntimeException("try")。
所以,类似的问题,看字节码就行了。
如果涉及到异常相关,看异常表即可。
学习了
学习了!
涨知识了
你好,是不是从27行 27: invokevirtual #9 看出,aload_1取的是astore_1呢?
学习了
学到了
涨知识!
实际上是下面的代码
最终抛出的错误是java.lang.RuntimeException: finally
我的理解是:
throw exception也是方法返回的一种而finally里的返回是会覆盖try里的返回的