一、try-finally语句的基本使用
try {
// 可能会抛出异常的代码块
} finally {
// 无论是否抛出异常都会执行的代码块
}
在Java中,我们常常需要进行一些清理工作,例如关闭I/O流、释放数据库连接、解除锁定等操作。try-finally语句就是用来实现这一目的的。无论try块中是否引发了异常,finally中的代码块总是会被执行,这通常用于释放资源。
假如我们希望在方法返回前关闭一个I/O流,try-finally语句就可以这样使用:
public static void readFile(String fileName) throws IOException {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
无论try块代码是否抛出IOException,finally中的close()方法总是会被执行,来保证reader资源得到关闭。
二、try-catch-finally语句的使用
try {
// 可能会抛出异常的代码块
} catch (Exception e) {
// 异常处理代码块
} finally {
// 无论是否抛出异常都会执行的代码块
}
try-catch-finally语句是Java中处理异常的标准方式,catch块用于处理可能会抛出的异常,finally块用于清理资源。如果finally块中也抛出了异常,那么它会覆盖前面的异常,成为最后的抛出异常。
下面是一个简单的例子展示try-catch-finally的使用:
public static void readFile(String fileName) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如果在读取文件过程中抛出了IOException,控制权会跳到catch块中进行异常处理,接着finally块中的close()方法会被调用,来保证reader资源得到关闭。
三、try-catch-finally语句的嵌套使用
try {
try {
// 可能会抛出异常的代码块1
} catch (Exception e1) {
// 异常处理代码块1
} finally {
// 无论是否抛出异常都会执行的代码块1
}
} catch (Exception e2) {
// 异常处理代码块2
} finally {
// 无论是否抛出异常都会执行的代码块2
}
try-catch-finally语句可以进行嵌套使用,内层的异常处理会覆盖外层的异常处理。当然,内层finally块的代码总是会被优先执行,因为内层finally块在外层finally块之上。
下面是一个简单的例子展示try-catch-finally的嵌套使用:
public static void readFile(String fileName) {
BufferedReader reader = null;
try {
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
顶层的try-catch语句用于抛出readFile()方法中发生的IOException异常,内部的try-catch-finally语句用于读取文件。当文件读取出现问题时,顶层的IOException异常会被抛出并进行处理,而内部的异常处理代码块会被忽略,但内部的finally块仍然会被优先执行,以保证reader资源的释放。
四、finally块的使用注意事项
finally块虽然是无论是否抛出异常总会执行的代码块,但是在特定情况下,finally块中的代码也有可能不会被执行。下面是一些finally块使用注意事项:
- 如果在try块或catch块中调用了System.exit(),那么finally块将不会执行。
- 如果在try块中存在一个无限循环或者死循环,那么finally块将不会执行。
- 如果在try块中使用了return语句,那么finally块中的语句会在方法返回之前被执行。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/241598.html
微信扫一扫
支付宝扫一扫