java 异常
带资源的 try 语句
如果一个类实现了 AutoCloseable
接口, 那么可以使用带资源的 try
语句.
它可以在抛出异常或正常结束两种情况调用 close
方法. 当正常结束时没什么可说的,
当其它代码抛出异常时:
- 如果
close
调用也抛出异常, 那么它的异常会被抑制, 并由addSuppressed
方法添加到原来的异常中, 后续可以通过getSuppressed
方法获取被抑制的异常列表; - 如果
close
调用成功, 没有抛出异常, 那么就跟之前的情况一致啦.
带资源的 try
语句(try-with-resources)的最简形式:
try (Resource res = ...) {
work with res
}
示例代码:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class TestTryResource {
public static void main(String[] args) {
try (Scanner in = new Scanner(new FileInputStream("in.txt"), "UTF-8");
PrintWriter out = new PrintWriter("out.txt")) {
while (in.hasNext()) {
String str = in.next();
System.out.println(str);
out.write(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
使用异常机制的技巧
1. 异常处理不能代替简单的测试
只有在异常情况下使用异常机制. 如下代码, 在使用异常时性能急剧降低:
if (!s.empty()) {
s.pop();
}
try {
s.pop();
} catch (EmptyException e) {
// ignore
}
2. 不要过分地细化异常
将正常处理与异常处理分开, 将异常处理放置在一起, 通过多个 catch
语句管理, 而不是每一个正常处理语句带一个异常处理.
3. 利用异常层次结构
抛出和捕获适当的异常类. 如果可以, 则尽量一种异常转换为另一种更加合适的异常.
建议
- 解耦
try/catch
和try/finally
语句, 提高代码清晰度:
try {
try {
code that may throw exceptions
} finally {
do some tings
}
} catch (Exception e) {
show error message
}