[Java]异常机制
异常的概念
异常就是”不正常”的含义,在Java语言中主要指运行阶段发生的错误
java.lang.Throwable类是Java语言中错误(Error类)和异常(Exception类)的超类
- 其中Error 类主要描述比较严重通常无法编码解决的错误
- 其中Exception类主要描述轻微可以编码解决的错误
异常的分类
java.lang.Exception类是所有异常的超类,具体分类如下:
(1)RuntimeException异常
运行时异常,叫做非检测性异常
(2)IOException异常和其他异常
除运行时的其他异常,叫做检测性异常
所谓检测性异常就是在编译阶段能够被编译器检测出来并给出提示的异常
RuntimeException异常的主要子类:
- ArithmeticException —— 算数异常
- ArrayIndexOutOfBoundsException —— 数组下标越界异常
- NullPointerException —— 空指针异常
- ClassCastException —— 类型转换异常
- NumberFormatException —— 数字格式异常
注意:
当程序执行过程中发生异常又没有手动处理时,则由Java虚拟机采用默认方式处理,而默认处理方式:打印异常的名称,异常的原因,异常发生位置后终止程序,导致后续代码无法执行。
异常的避免
对于绝大多数的非检测性异常可以直接使用if条件判断来避免该异常的发生
异常的捕获
- 语法格式
try{
编写所有可能发生异常的语句;
}catch(异常类型 变量名){
编写针对该类异常处理的语句;
}
…
finally{
编写无论是否发生异常都改执行的语句;
} - 注意事项
(1)若需要多个catch分支时,切记小类型的异常放在大类型的前面
(2)懒人写法:catch(Exception e){…}
(3)finally{ }中的代码主要用于进行善后工作的处理,如:关闭打开的文件,删除文件等
笔试题:final,finally,finalize( ) 之间的区别?
解析:final 是关键字,修饰类时不能被继承,修饰方法时不能被重写,修饰变量时必须赋值且不可更改;
finally是关键字,与 try - catch 这个分支搭配使用,做善后处理;
finalize( )是一个方法,当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用次方法
异常的抛出
- 基本概念
在某些特殊的场合中无法处理或不便于处理发生的异常,此时就需要将异常转移给该方法的调用者处理,这种方式就叫做异常的抛出 - 语法格式
访问控制符 返回值类型 方法名称(形参列表)throws 异常类型1,异常类型2,…{ } - 方法重写的原则
(1)要求方法名,参数列表,返回值类型都相同,从jdk1.5开始可返回子类
(2)要求方法权限不能变小,可以相同或者变大
(3)要求不能抛出更大的异常
注:子类重写的方法可以抛出与父类一样的异常,更小的异常以及不抛出异常,但不能抛出更大的异常或平级不一样的异常
自定义异常
1.基本概念
虽然Java官方提供了大量异常但没有专门针对年龄不合理的异常类,若希望使用这种针对性的异常就需要程序员自己写一个异常类
2.实现流程
(1)自定义xxxxException继承Exception或者其子类
(2)提供两个版本的构造方法:无参构造和字符串作为参数的构造
3.异常对象的产生
throw new 异常类型();
如:throw new NullPointerException();— 产生空指针异常
笔试题:throws和throw的区别?
解析:throws 在小括号外接,throw在方法体里接;throws后接异常类型,throw后接数据对象;throws后可跟多个类型,throw后只能跟一个对象
总结
- 在以后的开发中,尽量使用if条件判断避免异常的发生
- 若实在避免不了,则进行异常的捕获和处理
- 若实在捕获不了,则进行异常的抛出处理
- 若希望表达针对性的异常,则需要自定义异常