finally的理解(一)

本文详细解析了Java中finally语句的行为特征,包括其在不同情况下的执行逻辑,例如与return语句、System.exit(0)及内部return语句的交互。通过具体示例展示了finally块如何影响方法的返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结论:(个人见解,如果错误还望指正)
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.当try或catch块中有System.exit(0)语句时,finally块中的语句不会执行;
4.finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的(针对primitive type或不可变对象入String);
5.finally块中可以包含return语句。
6.当遇到return后将返回值(非主业务类型为地址)保存到某一内存快(如栈),然后执行finally语句。假如finally改变了原返回对象,如果为可变对象,则栈中的值也随之改变,如果为不可变对象或主业务类型,栈中的值不会改变。
7.当finally中有return语句,则此返回值会覆盖原来保存在栈中的返回值


public class Test {
public static void main(String[] args) {
System.out.println("main1: " + Test.test1().toString());
System.out.println();
System.out.println("main2: " + Test.test2());
System.out.println();
System.out.println("main3: " + Test.test3());
System.out.println();
System.out.println("main4: " + Test.test4());
}

static StringBuilder test1() {
StringBuilder sBuilder = new StringBuilder();
try {
sBuilder.append("java");
System.out.println("try1: " + sBuilder.toString());
return sBuilder;
} finally {
sBuilder.append("eye");
System.out.println("finally1: " + sBuilder.toString());
}
}

static int test2() {
int i = 1;
try {
System.out.println("try2:" + i);
return i;
} finally {
++i;
System.out.println("finally2:" + i);
}
}
static String test3() {
StringBuilder sBuilder = new StringBuilder();
try {
sBuilder.append("cs");
System.out.println("try3: " + sBuilder.toString());
return sBuilder.toString();
} finally {
sBuilder.append("dn");
System.out.println("finally3: " + sBuilder.toString());
}
}

static int test4() {
int i = 1;
try {
System.out.println("try4:" + i);
return i;
} finally {
++i;
System.out.println("finally4:" + i);
return i;
}
}
}


运行结果如下:
[quote]
try1: java
finally1: javaeye
main1: javaeye

try2:1
finally2:2
main2: 1

try3: cs
finally3: csdn
main3: cs

try4:1
finally4:2
main4: 2
[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值