异常丢失的情况:
  public class NeverCaught{
  static void f()throws ExceptionB{
  throw new ExceptionB("exception b");
  }
  static void g()throws ExceptionC{
  try{
  f();
  }catch(ExceptionB e){
  ExceptionC c=new ExceptionC("exception a");
  throw c;
  }
  }
  public static void main(String[]args){
  try{
  g();
  }catch(ExceptionC e){
  e.printStackTrace();
  }
  }
  }
  /*
  exception.ExceptionC
  at exception.NeverCaught.g(NeverCaught.java:12)
  at exception.NeverCaught.main(NeverCaught.java:19)
  */
  为什么只是打印出来了ExceptionC而没有打印出ExceptionB呢?这个还是自己分析一下吧!
  上面的情况相当于少了一种异常,这在我们排错的过程中非常的不利。那我们遇到上面的情况应该怎么办呢?这是异常链的用武之地:保存异常信息,在抛出另外一个异常的同时不丢失原来的异常。
  public class NeverCaught{
  static void f()throws ExceptionB{
  throw new ExceptionB("exception b");
  }
  static void g()throws ExceptionC{
  try{
  f();
  }catch(ExceptionB e){
  ExceptionC c=new ExceptionC("exception a");
  //异常连
  c.initCause(e);
  throw c;
  }
  }
  public static void main(String[]args){
  try{
  g();
  }catch(ExceptionC e){
  e.printStackTrace();
  }
  }
  }
  /*
  exception.ExceptionC
  at exception.NeverCaught.g(NeverCaught.java:12)
  at exception.NeverCaught.main(NeverCaught.java:21)
  Caused by:exception.ExceptionB
  at exception.NeverCaught.f(NeverCaught.java:5)
  at exception.NeverCaught.g(NeverCaught.java:10)
  ...1 more
  */
  这个异常链的特性是所有异常均具备的,因为这个initCause()方法是从Throwable继承的。
  例4.清理工作
  清理工作对于我们来说是必不可少的,因为如果一些消耗资源的操作,比如IO,JDBC。如果我们用完以后没有及时正确的关闭,那后果会很严重,这意味着内存泄露。异常的出现要求我们必须设计一种机制不论什么情况下,资源都能及时正确的清理。这是finally。
  public void readFile(String file){
  BufferedReader reader=null;
  try{
  reader=new BufferedReader(new InputStreamReader(
  new FileInputStream(file)));
  //do some other work
  }catch(FileNotFoundException e){
  e.printStackTrace();
  }finally{
  try{
  reader.close();
  }catch(IOException e){
  e.printStackTrace();
  }
  }
  }