try catch finally 关闭流标准的写法

本文介绍在Struts2框架中如何正确处理资源流的打开与关闭操作,强调了在finally块中检查流是否为空并进行异常处理的重要性。

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

平常开发中,都知道要在finlly里关闭流,但是有时finlly里代码不当,会引起另外的异常。
以下是看struts2源代码看到的,随手记录下。
有两点注意:
(1)判断流是否为空。
(2)filly里要捕获异常


InputStream in = null;
try {
in = settingsUrl.openStream();
settings.load(in);
} catch (IOException e) {
throw new StrutsException("Could not load " + name + ".properties:"
+ e, e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException io) {
//log
}
}
}
Java 中使用 `try-catch` 块关闭的正确方法,是确保即使在发生异常的情况下,资源也能被正确释放。Java 提供了多种方式来实现这一目标,但最佳实践应兼顾代码的可读性、健壮性和资源管理的有效性。 ### 使用 try-with-resources(推荐) 从 Java 1.7 开始,引入了 **try-with-resources** 语法结构,它允许声明一个或多个资源(如),并在 try 块执行结束后自动关闭这些资源,无论是否抛出异常。这种方式极大地简化了资源管理逻辑,并避免了因忘记关闭而导致的资源泄漏问题[^2]。 示例代码如下: ```java try (FileInputStream in = new FileInputStream("input.txt")) { int data; while ((data = in.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); } ``` 上述代码中,`FileInputStream` 被声明在 try 的括号内,这意味着该会在 try 块结束时自动关闭,无需手动调用 `close()` 方法。此方式适用于所有实现了 `AutoCloseable` 接口的资源。 ### 在 try-catch-finally 中手动关闭 对于 Java 1.7 之前的版本或需要兼容旧代码的情况,通常采用传统的 `try-catch-finally` 结构来确保关闭。这种方式虽然有效,但容易因逻辑错误导致资源未被释放,例如在 try 块中打开但在 catchfinally 中未能正确处理异常和关闭操作[^1]。 正确的写法如下: ```java FileInputStream in = null; try { in = new FileInputStream("input.txt"); int data; while ((data = in.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在此结构中,`finally` 块用于确保无论是否发生异常,都会被关闭。需要注意的是,在 finally 块中再次捕获 `IOException` 是为了防止关闭时抛出异常影响程序程[^3]。 ### 总结 - **try-with-resources** 是现代 Java 编程中关闭的最佳实践,适用于 Java 1.7 及以上版本,能够自动关闭资源并简化代码逻辑。 - **try-catch-finally** 是传统做法,适用于早期版本或特定场景,需特别注意在 finally 中安全地关闭资源。 - 无论采用哪种方式,都应确保在异常情况下不会遗漏资源的释放,从而避免潜在的内存泄漏或文件锁定问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值