try catch finally的底层原理
来源:https://blog.csdn.net/lwd512768098/article/details/114728720
finally终究执行
public static int test() {
int i = 1;
try {
i++;
} finally {
System.out.println("finally yeah!");
}
return i;
}
public static void main(String[] args) {
System.out.println(test());
}
输出为
![](https://filescdn.proginn.com/a975c23f6a87996590bcfa5f4ea756a3/ea13b133efc2381bc1ed26ac3e8732ad.webp)
public static int test() {
int i = 1;
try {
i++;
throw new Exception();
} catch (Exception e) {
System.out.println("Exception yeah!");
} finally {
System.out.println("finally yeah!");
}
return i;
}
public static void main(String[] args) {
System.out.println(test());
}
![](https://filescdn.proginn.com/6ded7a1f98e8261b51ce6fb666443851/75f81c3a71c8b147702f5b41374401e9.webp)
带有return的情况
finally不带return的情况
对于return情况的话,只要记住一句话就行,如果finally里面有return, 那么就会覆盖try块或者catch里面的return内容,否则的话,在执行finally的内容之前(try块或者catch里面有return语句),会计算好try或者catch里面的return表达式的值,然后保存到另一个局部变量,当执行fianlly的时候,会重新加载这个局部变量作为返回值,因此在finally的操作不会影响返回值,下面我们字节码来看看内部的工作原理。
public static int test() {
int i = 1;
try {
i++;
return i;
} finally {
i++;
System.out.println("finally yeah!");
}
}
public static void main(String[] args) {
System.out.println(test());
}
第二个问题:最终结果是多少?
![](https://filescdn.proginn.com/d672f15ab3aae0db02a41bab6a5c409a/e44710464def0fa6515c62e96e09f447.webp)
![](https://filescdn.proginn.com/b87d071316deaea5b630293024857b6e/ad97e495505d6a486b8acff429247652.webp)
finally带有return
public static int test() {
int i = 1;
try {
i++;
return i;
} finally {
i++;
System.out.println("finally yeah!");
return i;
}
}
public static void main(String[] args) {
System.out.println(test());
}
![](https://filescdn.proginn.com/f46691c0e134b8fb4d67573e3fed2c0c/b25dac7db95a1b6a4fa8106a3c9d790c.webp)
没错,返回了3,说明finally对i的修过是其效果的,我们从字节码看看原因:
![](https://filescdn.proginn.com/1d50c9ab2451430353bf6bdfc0abf2b4/655d645376bd6fdb17f4a1aaee19e439.webp)
try, catch, finally均没有return语句
public static int test() {
int i = 1;
try {
i++;
} finally {
i++;
System.out.println("finally yeah!");
}
return i;
}
public static void main(String[] args) {
System.out.println(test());
}
![](https://filescdn.proginn.com/aae9ceeda277862b8d42b1ec7982b7ea/ea123759073e02a01446b27922a9ea28.webp)
总结
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
评论