异常处理机制主要回答了三个问题
What:异常类型回答了什么被跑出
Where:异常堆栈跟踪回答了在哪抛出
Why:异常信息回答了为什么被抛出
Error和Exception的区别
Error:程序无法处理的系统错误,编译器不做检查
Exception:程序可以处理的异常,捕获后可能恢复
总结:前者是程序无法处理的错误,后者是可以处理的异常
Java的异常体系
RuntimeException:不可预知的,程序应该自行避免
非RuntimeException:可预知的,从编译器检验的异常
从责任角度看:
- Error属于JVM需要承担的责任
- RuntimeException:是程序应该承担的责任
- Checked?Exception:可检查异常,是Java编译器应该负担的责任
常见Error及Exception
- NullPointerException-空指针引用异常
- ClassCastException-类型强制转换异常
- IllegalArgumentException-传递非法参数异常
- IndexOutOfBoundsException-下标越界异常
- NumberFormatException-数字格式异常
Error
- NoClassDefFoundError-找不到class定义的异常
- StackOverflowError-深度递归导致栈被耗尽而抛出的异常
- OutOfMemoryError-内存溢出异常
NoClassDefFoundError的成因:
- 类依赖的class或jar不存在
- 类文件存在,但在不同的域中
- 大小写问题,Javac编译的时候无视大小写,很有可能编译出来的class文件与想要的不一致
Java的异常处理机制
抛出异常:创建异常对象,交由运行时系统处理
捕获异常:寻找合适的异常处理器处理异常,否则终止运行
Try-catch的性能
Java异常消耗性能的地方
- try-catch块影响jvm的优化
- 异常对象实例需要保存栈快照等信息,开销较大
|