• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

try-catch VS try-catch-finally

try-catch 和 try-catch-finally 是Java中用于异常处理的两种基本结构,它们的主要区别在于资源管理和流程控制上。

  • try-catch
  1. 功能:主要用于捕获并处理代码块中可能发生的异常。当try块中的代码执行时遇到异常,对应的catch块将被执行,处理异常。

  2. 特点:如果try块没有抛出任何异常,则catch块不会执行。适合于只需要捕获并处理异常,而不需要关注资源释放或最终操作的场景。

  • try-catch-finally
  1. 功能:除了具有try-catch的功能外,还增加了一个finally块。无论try块是否发生异常,也不管是否有匹配的catch块处理了异常,finally块总会被执行(除非程序提前退出如系统崩溃)。

  2. 特点:

资源清理:非常适合用来关闭在try块中打开的资源,如文件流、数据库连接等,确保资源被正确释放。

最终操作:可以执行一些无论是否发生异常都需要进行的操作。

异常覆盖:如果finally块也抛出了异常,并且try或catch块已经处理了一个异常,那么原始异常会被finally块中抛出的异常覆盖(除非使用特殊技巧保留原始异常信息)。

  • try-with-resources (Java 7+)
    另外,从Java 7开始引入了try-with-resources语句,它进一步简化了资源管理,自动关闭实现了AutoCloseable接口的资源,结合了try-catch-finally的优点,但语法更简洁:

在 try-with-resources 语句中,圆括号 () 里应该写入需要自动关闭的资源声明和初始化。这些资源必须实现 AutoCloseable 接口(或者其子接口 Closeable)。典型的例子包括文件输入输出流 (FileInputStream, FileOutputStream)、缓冲读写器 (BufferedReader, BufferedWriter)、数据库连接 (Connection) 等。
例如:

try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
     BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
    // 在这里安全地使用 reader 和 writer
    // 读写操作...
} catch (IOException e) {
    // 处理可能发生的 IOException 异常
    e.printStackTrace();
}


在这个例子中,BufferedReader 和 BufferedWriter 都是在 try 的圆括号中声明和初始化的。当 try 代码块执行完毕(无论是正常结束还是因异常退出),这两个资源会自动被关闭,因为它们实现了 AutoCloseable 接口。这样就无需在 finally 块中手动关闭它们了。

posted on 2024-06-06 16:33  周政然  阅读(63)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3