5.异常丢失

Posted 疯狂的肉包

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.异常丢失的主要内容,如果未能解决你的问题,请参考以下文章

配置更改后片段丢失过渡动画

在片段着色器中丢失纹理定义

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

异常和TCP通讯

从第二个片段访问时 ViewModel 数据丢失状态

片段中的Android致命异常