一、异常
什么是异常
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活
try { 可能会报错的代码 }catch(Exception e){ 异常处理代码 } try { 可能会报错的代码 }catch(Exception e){ 异常处理代码 }finally { 不管程序是否报错都执行 }
二、常见的异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc" 转换成数字 |
三、多重catch块
引发多种类型的异常
1.排列catch 语句的顺序:先子类后父类
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的catch语句
try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一
四、抛出异常
使用关键字throws
使用throw抛出异常throw与throws
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出了异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
五、声明异常
制造异常,使用关键字throw
throw new Ch06Exception("没有A4纸了");
如果在一个方法体中抛出了异常,如何通知调用者?
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式1:调用者处理异常
方式2:调用者继续声明异常
main()方法声明的异常由Java虚拟机处理
六、自定义异常
当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类使用自定义异常的步骤
/** * 自定义异常 * @author zy * */ public class Ch06Exception extends RuntimeExceotion{ public Ch06Exception(String message){ super(message); } }
使用自定义异常的步骤:
1、定义异常类 2、编写构造方法,继承父类的实现 3、实例化自定义异常对象 4、使用throw抛出
异常链
A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新异常呢?
抛出原有的异常
A方法与B方法进行了关联,不便于代码的修改和扩展
抛出新的异常
异常链创建了新的异常但却保留了原有异常的信息
异常处理原则:
1、异常处理与性能
2、异常只能用于非正常情况
3、不要将过于庞大的代码块放在try中
4、在catch中指定具体的异常类型
5、需要对捕获的异常做处理
总结
-
异常分为Checked异常和运行时异常
Checked异常必须捕获或者声明抛出
运行时异常不要求必须捕获或者声明抛出
-
try-catch-finally中存在return语句的执行顺序
-
finally块中语句不执行的情况
-
throw和throws关键字的区别