/**
* @author wang
* @description 直接复制下来运行。
* @create 2022/3/4 15:14
*/
public class TTT {
public static int sum1() {
int firstNum = 1;
int secondNum = 2;
int result = 0;
try {
//计算结果
result = firstNum + secondNum;
return result;
} finally {
System.out.println("sum1() finally块被执行了!");
}
}
public static int sum2() {
int firstNum = 1;
int secondNum = 2;
int result = 0;
try {
//计算结果
result = firstNum + secondNum;
return result;
} finally {
System.out.println("sum2() finally块被执行了!");
result = 777;
}
}
public static int sum3() {
int firstNum = 1;
int secondNum = 2;
int result = 0;
try {
result = firstNum + secondNum;
return result;
} finally {
System.out.println("sum3() finally块被执行了!");
result = 7;
return result;
}
}
public static int sum4() {
int firstNum = 1;
int secondNum = 2;
int result = 0;
try {
//计算结果
result = firstNum + secondNum;
//制造异常
int i = 1 / 0;
return result;
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
System.out.println("sum4() finally块被执行了!");
result = 7;
return result;
}
}
public static int sum5() {
int firstNum = 1;
int secondNum = 2;
int result = 0;
try {
//计算结果
result = firstNum + secondNum;
//系统退出,,,finally不再执行
System.exit(1);
return result;
} finally {
System.out.println("sum5() finally块被执行了!");
result = 7;
return result;
}
//编译器会报错,因为无法执行到此处
//return 1111;
}
public static void main(String[] args) {
System.out.println(TTT.sum1());
System.out.println(TTT.sum2());
System.out.println(TTT.sum3());
System.out.println(TTT.sum4());
System.out.println(TTT.sum5());
//结论:
//try { return A }catch{ }finally{ } 原引用为A,会”备份“A,记为B (A,B都在栈上)
// 当A是基本类型时,不管你如何对A进行操作,返回的是B的值,除非你在fianlly中 也return A 则B值会被更新。
//当A是引用类型。你备份的B和A指向的是堆中同一块内存,你用A任意引用操作对象,返回的都是更改后的同一个对象。
}
}
运行结果:
sum1() finally块被执行了!
3
sum2() finally块被执行了!
3
sum3() finally块被执行了!
7
/ by zero
sum4() finally块被执行了!
7