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. 利用异常层次结构

抛出和捕获适当的异常类. 如果可以, 则尽量一种异常转换为另一种更加合适的异常.

建议

  1. 解耦 try/catchtry/finally 语句, 提高代码清晰度:
try {
  try {
    code that may throw exceptions
  } finally {
    do some tings
  }
} catch (Exception e) {
  show error message
}
posted @ 2016-10-27 23:12  whilst  阅读(170)  评论(0编辑  收藏  举报