异常与错误
Error和Exception的区别
从概念上看
- Error:程序无法处理的系统错误,编译器不做检查;
- Exception:程序可以处理的异常,捕获后可能恢复。
从责任上看
- Error属于JVM需要负担的责任;
- RuntimeException是程序应该负担的责任;
- Checked Exception可检查异常时Java编译器应该负担的责任。
Java的异常体系
除RuntimeException外的异常均是可预知的,从编译器校验的异常。
常见的Error以及Exception
RuntimeException
- NullPointerException ——空指针引用异常;
- ClassCastException ——类型强制转换异常;
- IllegalArgumentException ——传递非法参数异常;
- IndexOutOfBoundsException ——下标越界异常;
- NumberFormatException ——数字格式异常。
非 RuntimeException
- ClassNotFoundException ——找不到指定class的异常 ;
- .IOException -——IO操作异常。
Error
- NoClassDefFoundError ——找不到class定义的异常;
- StackOverflowError ——深递归导致栈被耗尽而抛出的异常;
- 〇utOfMemoryError ——内存溢出异常。
NoClassDefFoundError的原因:
- 类依赖的class或者jar不存在;
- 类文件存在,但在不同域中;
- 大小写问题,javac编译无视大小写,很可能编译出来的class文件与想要的不一致。
Java异常处理
Java的异常处理机制
- 抛出异常:创建异常对象,交由运行时系统处理;
- 捕获异常:寻找合适的异常处理器处理异常,否则终止运行。
Java异常的处理原则
- 具体明确:抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因;
- 提早抛出:应尽可能早发现并抛出异常,便于精确定位问题;
- 延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域处理异常。
高效主流的异常处理框架
- 设计通用继承RuntimeException的异常统一处理;
- 其余异常转译为上述异常AppException;
- 在catch后,抛出上述异常的子类,并提供足以定位的信息;
- 由前端接收AppException做统一处理。
try-catch:影响JVM的优化、异常对象实例需要保存栈快照等信息,开销较大。
彩蛋
虽然这部分与主题没什么关系,但是也是经常会出现的疑问。
String、StringBuffer和StringBuilder的区别