关于java异常try catch finally的一道题
程序员文章站
2022-03-24 13:37:48
这两天,有人咨询我一道关于java基础的题,具体代码如下: 他问我这个方法的返回结果是多少?finally代码块不是一定会执行的吗?a不是赋值了40?为什么a返回的是30?我说返回30,具体为什么是30呢?,为了更有说服力,我把上面代码的class进行反编译,得到如下代码: 我们看第9和第10两行代 ......
这两天,有人咨询我一道关于java基础的题,具体代码如下:
1 private static int m1() { 2 int a = 10; 3 try { 4 a = 20; 5 throw new runtimeexception(); 6 } catch (exception e) { 7 a = 30; 8 return a; 9 } finally { 10 a = 40; 11 } 12 }
他问我这个方法的返回结果是多少?finally代码块不是一定会执行的吗?a不是赋值了40?为什么a返回的是30?
我说返回30,具体为什么是30呢?,为了更有说服力,我把上面代码的class进行反编译,得到如下代码:
1 private static int m1(){ 2 int a = 10; 3 try { 4 a = 20; 5 throw new runtimeexception(); 6 } catch (exception e){ 7 e = e; 8 a = 30; 9 int i = a; 10 a = 40;return i; 11 } finally { 12 localobject = finally; 13 a = 40; 14 throw ((throwable)localobject); 15 } 16 }
我们看第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)。
推荐阅读
-
C#异常处理中try和catch语句及finally语句的用法示例
-
Java中try..catch..finally语句的使用
-
Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】
-
Java编程中异常处理 try-catch-finally语句的一些分析
-
Java异常处理2---常见的方法配合try--catch如何使用以及好处
-
Java常见问题 try-catch-finally异常处理总结
-
try、catch、finally详解,你不知道的异常处理
-
关于java异常try catch finally的一道题
-
JAVA--异常基础介绍 try-catch-finally和throws基础讲解
-
C#异常处理中try和catch语句及finally语句的用法示例