1. Java的异常概念
1.1 异常体系结构
从上图中可以看到:
- 1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
- 2. Error:指的是JVM无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型的代表:StackOverflowError和OutOfMemoryError,一旦出现,无法回天!
- 3. Exception:异常产生后程序员可以通过代码进行处理,使得程序可以继续运行。
1.2 异常分类
编译时异常
- 在编译期间发生的异常,称为编译时异常,也叫作受检查异常
- 在编写代码的时候就需要进行处理,要么try catch 或者throws
2. 异常处理
2.1 防御式编程
- 事前防御 -- if else
- 缺陷:正常流程和错误处理流程代码混合在一起,代码整体显的十分复杂
- 事后认错 -- throw try catch
- 优势:正常流程和错误流程是分离开的 , 程序员更关注正常流程,代码更清晰,容易理解代码
-
2.2 异常抛出 -- throw
如果程序中出现错误,此时就需要将错误的信息告知给调用者,比如:参数检测。
具体语法如下:throw new XXXException ( " 异常产生的原因 " );
- throw必须写在方法内部;
- 抛出的对象必须是Exception 或者 Exception 的子类对象
- 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用出,直接交个JVM来处理。
- 如果抛出的编译时异常,用户必须处理,否则无法通过编译
- 异常一旦抛出,其后的代码就不会执行
2.3 异常的捕获 -- throws try-catch
2.3.1 异常声明 throws
- 当前方法不处理异常,提醒方法的调用者处理异常 。
语法格式:修饰符 返回值类型 方法名 ( 参数列表 ) throws 异常类型 1 ,异常类型 2 ...{}
- 1. throws必须跟在方法的参数列表之后
- 2. 声明的异常必须是 Exception 或者 Exception 的子类
- 3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。
- 4. 调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出
异常的处理方式
- System.out.println(e.getMessage()); // 只打印异常信息
- System.out.println(e); // 打印异常类型:异常信息
- e.printStackTrace(); // 打印信息最全面
2.3.2 finally 关键字
异常会引发程序的跳转,可能 导致有些语句执行不到,finally就是用来解决资源回收问题的
注意: finally 中的代码一定会执行的,一般在 finally 中进行一些资源清理的扫尾工作。
3. 自定义异常类
需要的步骤:
- 1. 自定义异常类,然后继承自Exception 或者 RunTimeException
- 2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因
注意:
- 自定义异常通常会继承自 Exception 或者 RuntimeException
- 继承自 Exception 的异常默认是受查异常
- 继承自 RuntimeException 的异常默认是非受查异常.