finally的理解(一)

本文详细解析了Java中finally语句的行为特征,包括其在不同情况下的执行逻辑,例如与return语句、System.exit(0)及内部return语句的交互。通过具体示例展示了finally块如何影响方法的返回值。
结论:(个人见解,如果错误还望指正)
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]
03-08
### Finally 关键字的用途与使用 Finally 是编程语言中的个重要关键字,主要用于异常处理机制中。当程序执行过程中可能发生异常时,`try-catch-finally` 结构提供了种优雅的方式来管理资源并确保某些代码总是被执行。 #### 1. Ensure Resource Cleanup 无论 `try` 块内的代码是否抛出了异常,`finally` 中定义的操作都会被执行。这使得 `finally` 成为了释放资源的理想位置,比如关闭文件流或者数据库连接等操作[^2]。 ```java FileInputStream fis = null; try { String path = "example.txt"; fis = new FileInputStream(path); } catch (FileNotFoundException e) { System.out.println("Exception occurred: " + e.getMessage()); } finally { try { if (fis != null) { fis.close(); } } catch (IOException ex) { // Handle exception here. } } ``` #### 2. Guarantee Code Execution 即使发生了未捕获的异常或其他类型的错误,`finally` 部分仍然会被调用。因此,在需要保证特定逻辑定会运行的情况下(如日志记录),可以将其放置于 `finally` 块内[^1]。 #### 3. Return Statement Behavior 值得注意的是,如果在 `try` 或者 `catch` 中存在返回语句,则 `finally` 还是在方法真正结束之前先被触发。这意味着可以在 `finally` 修改要返回的结果值,不过这种做法通常不推荐因为可能导致代码难以理解。 #### Important Considerations - 如果 JVM 终止或线程死亡等情况发生,那么 `finally` 可能不会得到执行。 - 不应该依赖 `finally` 来完成业务逻辑的核心部分;它更适合用于清理工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值