异常分类

  • 编译异常
  • 运行异常
  • 逻辑异常

异常继承结构:


  • Error: 严重异常错误 不可用用程序修改(一般发生于JVM中的异常)
  • Exception: 即逻辑异常,运行异常,java编译器不会检查,程序本身可以处理的异常,可以捕获异常进行处理
  • 非运行时异常:即编译异常,仅可能在程序中处理
  • 非受查异常:java编译器不会进行检查
  • 受查异常:java编译器会进行检查

异常处理

  • 捕获异常
  try{
   
   // 可以发生异常的代码
  }catch(可能出现的异常类型 e1){
   
    // 处理异常逻辑
  }catch(可能出现的异常类型 e2){
   
    // 处理异常逻辑
  }finally{
   
    // finally部分可有可无
  }

1.如果在try中没有发生异常,则直接指向finally中的代码逻辑
2.如果在try中发送异常,则会在catch中匹配相应的异常类型进行处理,再执行finally中的代码逻辑
3.建议多个catch类型时处理范围重小到大进行书写

  • 声明异常
public FileInputStream(String name) throws FileNotFountException{
   
   this(name != null ? new File(name): null);
}

1.关键字 throws 可能出现异常时可以使用throws进行抛出异常
2.子类声明异常的范围不能超过父类声明的范围
3.父类没有声明异常,子类也不能
4.子类重写的方法中声明的异常类,需要与父类被重写方法中声明的异常类保存一致,或是父类被重写方法中声明的异常类的子类

自定义异常

  • 为什么要自定义异常:封装,快速定位
  • 自定义异常的步骤:1.创建类;2.继承Exception类或者Exception的子类;3.重写构造方法
public class DemoException extends Exception{
   
    public DemoException(){
   
    }

   public DemoException(String message){
   
   super(message);
   }
}

手动抛出异常

  • 找到一个合适的异常类
  • 创建这个异常类的对象
  • 抛出这个对象
   public class Daughter{
   

     public static void main(String[] args){
   
        Daughter d = new Daughter();   
        try{
   
          d.eat();
        }catch(DemoException e){
   
           e.printStackTrace();
       }

    public void eat()throws DemoException{
   
        System.out.println("出现异常了");
        throw new DemoException("异常信息");
       }
    }
 }

访问异常信息

  • 堆栈轨迹(stack trace): 方法调用过程的列表
  获取异常信息的重要方法(Exception类)
  1.printStackTrace();
  2.getStackTrace();

git地址