概述

  1. 程序在进行过程中发生的错误,叫做异常
  2. 作用:增强程序的健壮性
  3. 异常在java中以类的形式存在,每一个异常类都能创建对象
  4. 所有的错误(error)和异常(exception)都是可以抛出的
  5. 所有的错误(error)只要执行,JVM退出(不能处理)

  1. 编译时异常和运行时异常都是发生在运行阶段,在编译阶段异常是不会发生
    1. 所有异常都是在执行时发生的:
      1. 因为异常只有在执行时才能new对象
      2. 异常的发生就是new异常对象
  2. 编译时异常为什么而得名?
    1. 因为编译时异常必须在编译阶段预先处理,如果不处理,报错
  3. 运行时异常又称 非受控异常 未受检异常 (UnCheckedException)
  4. 编译时异常又称 受检异常 受控异常 (CheckedExeption)

对异常的处理

java中有两种方式处理异常

  1. 在方法声明的位置上使用throws 关键字 (抛给上一级)
    • 在java中如果一直上抛最后会抛给JVM 最后终止程序的执行
    • 一般不建议在main方法上使用throws关键字,建议使用 try..catch
  2. 使用try..catch 进行异常的捕捉

语法:

  1. try{
  2. // try 尝试 java代码
  3. }
  4. catch(异常 变量名){
  5. //捕捉异常后的分支
  6. }

编译时异常必须处理 要么上抛 要么捕捉

注意:
  1. 只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行
  2. 另外需注意,try语句块中某一行出现异常,该行后面的代码不会执行catch 捕捉到后,后续代码执行

自定义异常

  • 所有异常都有共同的特点
    • 有参构造
    • 无参构造
  • 自定义异常的编写

提供两个构造方法

  1. - 无参
  2. - 有参(string s
class MyException extends Exception {
    public MyException(){
    }
    public MyException(String s){
        super (s);
    }
}

抛异常

throw 关键字
throw new MyException(“这是一个自定义异常”);

深入 try catch

  • catch 后面的小括号可以是具体的异常类型,也可以是该异常类型的父类型
  • catch可以写多个,建议catch一个一个精准处理
  • catch写多个的时候,从上到下必须是从小到大

    什么时候选择捕捉/上报

  • 如果希望调用者来处理异常,使用上报

  • 其他情况使用捕捉

异常对象的两个重要方法

获取异常简单的描述信息 这个信息就是构造器里的String参数

Exception exception = new Exception("你的程序报错")
String s = exception.getMessage(); 
System.out.println(s); 这里会输出 你的  程序报错

打印异常追踪的堆栈信息

exception.printStackTrace();
    java.lang.Exception: asdfat While03.main(While03.java:6)

异常信息如何看
从上往下,一行一行(sun公司写的代码不用看)

finally

( 和try..catch 一起使用 )
  • 在finally子句中的代码时最后执行的,并且一定会执行
  • 即使try出了异常,也会执行
    try和fianlly可以联合使用(没有catch)
    try{
      System.out.println("aaa");
      return;
    } finally{
      System.out.println("bbb");
    }
    //输出结果 aaa  bbb
    

    但是如果try中有System.exit(0); //退出jvm

finally不执行 只有这一条代码能治他

总结

image.png