Java中的finally语句块用于定义一段一定会执行的代码,无论try语句块中有没有发生异常。
finally块是可选的,与try和catch块并列选择使用。如果一个异常被抛出而且被catch块(或者其sub类)捕获,那么控制流就会跳过finally块。如果try块没有抛出异常,那么finally块会在try块执行结束后执行。
finally块经常被用来确保特定操作的执行,这些操作比如说流的关闭或者是连接的释放(可以将这些代码写在finally块中),这些操作无论是否出现异常都将收到保护。
以下是两个finally块的使用示例:
示例一:用于释放资源
public void writeFile(String str) {
BufferedWriter bw = null; // 定义BufferedWriter对象
try {
bw = new BufferedWriter(new FileWriter("test.txt")); // 打开文件test.txt
bw.write(str); // 向文件中写入内容
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close(); // 关闭文件流
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
示例二:用于关闭数据库连接
public void queryData() {
Connection conn = null; // 定义Connection对象
Statement stmt = null; // 定义Statement对象
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // 打开数据库连接
stmt = conn.createStatement(); // 创建Statement对象
ResultSet rs = stmt.executeQuery("select * from person"); // 执行查询
while(rs.next()) {
System.out.println(rs.getString("name")); // 输出结果
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close(); // 关闭Statement对象
}
if (conn != null) {
conn.close(); // 关闭Connection对象
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在以上两个示例中,代码都无论是否发生异常都会执行finally语句块中的代码,即关闭资源和数据库连接。