9.1.1 异常概述
1.认识异常
异常: 在程序的运行过程中所发生的不正常事件;
- 文件找不到
- 网络连接中断或者不同
- 算术运算出错
- 数组下标越界
- 装载一个不存在多的类
- null对象操作
- 类型转换异常
通过 if - else 语句进行异常处理, 缺点如下:
- 代码臃肿, 加入大量异常情况判断和处理代码
- 影响开发效率
- 难以穷举所有的异常情况, 程序不健壮
- 影响代码的可读性, 加大日后程序的维护难度
2. Java异常体系结构
异常在java中被封装成了各种异常类;
所有异常类型都是 Throwable 类的子类, 它派生了两个类 : Error类 和 Exception类;
- Error: 表示仅靠程序本身无法恢复的严重错误;
- Exception: 由java应用程序抛出和处理的非严重错误;
异常 | 说明 |
Exception | 异常层次结构的根类 |
ArithmeticException | 算数错误异常, 如以零作为除数 |
ArrayIndexOutOfBoundException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
InputMismatchException | 想要的数据类型与时间输入的类型不匹配 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatexception | 数字格式转换异常, 如把“abc”转换成数字 |
9.1.2 Java异常处理机制
1.异常处理
五个关键字来处理: try , catch , finally , throw , throws;
2.使用try - catch处理异常
三种情况:
- 如果try语句块中所有语句正常执行完毕, 没有发生异常, 那么catch语句块中所有语句都将会被忽略。
- 如果try语句块在执行过程中发生异常, 并且这个异常与catch语句块中声明的异常类型匹配, 那么try语句块剩下的代码都将被忽略,而相应的catch语句块将会被执行。 匹配是指catch处理的异常类型 与 所生成的异常类型完全一致或是它的父类;
- 如果try语句块在执行过程中发生异常, 而抛出的异常在catch语句块中没有被声明,那么方法立刻退出;
3.使用try - catch - finally 处理异常
两种情况:
- 如果try语句块中所有语句正常执行完毕,finally语句块也会被执行;
- 如果try语句块在执行过程中发生异常, 无论这种异常能否被catch语句块捕获到, 都将执行finally语句块中的代码;
4.使用多重catch处理异常
一段代码可能会引发多种类型的异常, 可以在try语句块后面跟多个catch语句块分别处理不同的异常; 但排列顺序必须是从子类到父类, 最后一个一般都是Exception类;因为按照匹配原则, 如果把父类异常放到前面, 后面的catch语句块将不会获得执行机会;
5.使用throws声明抛出异常
关键字throws声明某个方法可能抛出的各种异常以通知调用者; throws可以同时声明多个异常, 之间用逗号隔开;
6.使用throw抛出异常
系统无法自动发现并解决, 需要程序员而不是系统来自行抛出异常, 把问题提交给调用者去解决;
throw 和 throws 的区别
(1)作用不同: throw 用于程序员自行产生并抛出异常, throws用于声明该方法内抛出了异常
(2)使用的位置: throw位于方法体内部, 可以作为单独语句使用, throws必须跟在方法参数列表的后面, 不能单独使用;
(3)内容不同:throws抛出一个异常对象, 只能是一个; throws后面跟异常类, 可以跟多个;
7.自定义异常
- 定义异常类, 并继承Exception 或者 RuntimeException
- 编写异常类的构造方法, 并继承父类的实现, 常见的构造方法:
//构造方法1
public MyException(){
super();
}
//构造方法2
public MyException(String message){
super(message);
}
//构造方法3
public MyException(String message , Throwable cause){
super(message , cause);
}
//构造方法4
public MyException(Throwable cause)
super(cause);
}
(3) 实例化自定义异常对象, 并在程序中使用throw抛出;
8. 异常链
创建新的异常, 保留了原有的异常的信息