zoukankan      html  css  js  c++  java
  • 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 { } } }
  • 相关阅读:
    C# 获取当前路径7种方法
    C# 获取当前路径7种方法
    C#委托的介绍(delegate、Action、Func、predicate)(转)
    C#委托的介绍(delegate、Action、Func、predicate)(转)
    DevExpressGridView自定义行高
    DevExpressGridView自定义行高
    C#IO读写txt文件的两种方法
    C#IO读写txt文件的两种方法
    NoSQL 简介
    NoSQL 简介
  • 原文地址:https://www.cnblogs.com/yangyunnb/p/6058492.html
Copyright © 2011-2022 走看看