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());
}
输出为
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());
}
带有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());
}
第二个问题:最终结果是多少?
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());
}
没错,返回了3,说明finally对i的修过是其效果的,我们从字节码看看原因:
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());
}
总结
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
评论