一.异常处理机制主要回答三个问题
(1)what:异常类型回答了什么被抛出
(2)where:异常堆栈跟踪回答了在哪抛出
(3)why:异常信息回答了为什么被抛出
二.Java异常体系
类的继承关系
Error和Exception区别
(1)Error:程序无法处理的系统错误,编译器不做检查,如系统奔溃,虚拟机错误,系统内存不足
(2)Exception:程序可以处理的异常,捕获后可以恢复
(3)总结:前者是程序无法处理的错误,后者是可以处理的异常
RuntimeException:不可预知,程序应当自动避免
#RuntimeException:可预知的,从编译器校验的异常
从责任角度看:
(1)Error属于JVM需要负担的责任
(2)RuntimeException是程序应当负担的责任
(3)checked Exception可检查异常是java编译器应当负担的责任
三.常见异常类型
RuntimeException常见类型
1.ArithmeticException-----出现异常的运算条件时,抛出此异常(例如:一个整数“除以零”时,抛出此类的一个实例)
2.NullPointerException-----空指针引用异常
3.ClassCastException--------类型强制转换异常
4.IllegalArgumentException-------传递非法参数异常
5.IndexOutOfBoundsExceptio-------下标越界异常
6.NumberFormatException-------数字格式异常(例如把String转化为int)
非RuntimeException常见类型
1.ClassNotFoundException------找不到指定class异常
2.IOException--------IO操作异常
Error常见异常
1.NoClassDefFoundError-----找不到class定义异常
(1)类依赖的class或者jar不存在
(2)类文件存在,但是存在不同的域中
(3)大小写问题,javac编译的时候是无规则的,很有可能编译出来的class文件与想要的不一样
2.StackOverflowError -----深递归导致栈被耗尽而抛出的异常
3.OutOfMemoryError--------内存溢出异常
四.java异常处理
java异常处理机制
(1)抛出异常:创建异常对象,交由运行时系统处理
(2)捕获异常:寻找合适的异常处理器处理异常,否则终止运行
java异常的处理原则
(1)具体明确:抛出的异常应能够通过异常类名和message准确说明异常的类型和产生异常的原因
(2)提早抛出:应尽量可能早的发现并抛出异常,便于精确定位问题
(3)延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常
五.高效主流异常处理框架
(1)设计一个通用的继承自Exception的异常来统一处理
(2)其余异常都统一转译为上述异常AppException
(3)在catch之后,抛出上述异常的子类,并提供足以定位的信息
(4)有前端接受AppException作统一处理
六.try-catch性能
java异常处理消耗性能的地方
(1)try-catch块影响JVM的优化
(2)异常对象实例需要保存栈快照等信息,开销较大