首页 > 代码库 > 5.异常丢失

5.异常丢失

5.异常丢失

情况一:捕获异常,抛出新异常

这种情况在上一片文章中介绍过,下面的代码中f()函数中抛出的异常就会丢失,可以使用 Exception ex=new Exception(); ex.initCause(e);保留异常

try{
     f();  
}catch(Exception e){
     throw new Exception();    
}

 情况二:finally中有return语句

f()中抛出的异常捕获不到

try{
    f();
}
finally {//try后边不一定要使用catch字句捕获异常
    return;
}                                                                                      

 情况二:finally中抛出的异常会丢失之前的异常

try {
      try{
            f();
      }finally {
            g();
      }
}catch (Exception e){
      e.printStackTrace();
}   

总结:

1.只能捕获到g()中的异常,捕获不到f()中的异常

2.finally中最好不要抛出异常

异常限制

1.父类A中有方法f()-抛出异常E1  子类B中有方法f()--a.可以抛出异常E1 b.可以抛出异常E2(E1子类) c.不抛出异常

2.抛出子类异常可以捕获父类的异常,反过来就不行

例子:

class BaseException extends Exception{}

class ChildException extends BaseException{}

abstract class Inning{
    public abstract void atBat() throws BaseException;
}

class StormInning extends Inning{
    public void atBat()throws ChildException{throw new ChildException();}
}

 

继承实现接口的异常处理---重要的知识点

interface Type1{
    void f()throws CloneNotSupportedException;
}

interface Type2{
    void f()throws InterruptedIOException;
}

class Type3 implements Type1,Type2{----如果只实现一个接口,可以不抛出异常,或者抛出接口中抛出的异常及其子类型
    public void f(){}
};
这里的f()必须抛出Type1,Type2中的异常的交集(也可以不抛出异常)

 

 

异常的精细化处理

  • 使用try块的嵌套,分级的捕获异常
  • class ReadFirstLine{
        public ReadFirstLine() {
            try {
                BufferedReader in = null;
                try {
                    in = new BufferedReader(new FileReader(new File("Test.iml")));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();//不需要关闭文件
                }
                String firstLine = in.readLine();
                System.out.println(firstLine);
            } catch (Exception e) {
    in.close();//关闭输出流 e.printStackTrace(); }
    finally { } } }

     

5.异常丢失