try-catch 和 try-catch-finally 是Java中用于异常处理的两种基本结构,它们的主要区别在于资源管理和流程控制上。
- try-catch
-
功能:主要用于捕获并处理代码块中可能发生的异常。当try块中的代码执行时遇到异常,对应的catch块将被执行,处理异常。
-
特点:如果try块没有抛出任何异常,则catch块不会执行。适合于只需要捕获并处理异常,而不需要关注资源释放或最终操作的场景。
- try-catch-finally
-
功能:除了具有try-catch的功能外,还增加了一个finally块。无论try块是否发生异常,也不管是否有匹配的catch块处理了异常,finally块总会被执行(除非程序提前退出如系统崩溃)。
-
特点:
资源清理:非常适合用来关闭在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 块中手动关闭它们了。
标签:BufferedWriter,try,finally,catch,new,异常 From: https://www.cnblogs.com/itcq1024/p/18235573