error和Exception的区别
Error:程序无法处理的系统错误,编译器不做检查,一般是指与jvm相关的问题。(系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出...)
Exception:程序可以处理的异常,捕获后可能恢复。
总结:前者是程序无法处理的错误,后者是可以处理的异常。
RuntimeException:不可预知的,程序应当自行避免。
(IndexOutOfBoundsException数组下标越界,NullPointerExveption访问空指针,ClassCastException类强制转换异常,IllegalArgumentException传递非法参数异常,NumberFormatException数字格式异常)
非RuntimeException:可预知的,从编译器校验的异常。
(IOExceptionIO操作异常,ClassNotFoundExpection找不到指定class的异常)
Error
1.NoClassDefFoundError找不到class定义的异常(1.类依赖的class或者jar不存在。2.类文件存在,但存在不同的域中。3.大小写问题,javac变异的时候是无视大小写的,很有可能编译出来的class文件就与想要的不一样)
2.StackOverflowError深递归导致栈耗尽而抛出的异常
3.OutOfMemoryError内存溢出异常
从责任角度看:
1.Error属于JVM需要承担的责任;
2.RuntimeException是程序应该承担的责任;
3.Checked Exception可检查异常是java编译器应该承担的责任。
java异常处理机制
抛出异常:创建异常对象,交由运行时系统处理。
捕获异常:寻找合适的异常处理器处理异常,否则终止运行。
具体明确:跑出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因;
提早抛出:应尽可能早的发现并抛出异常,以便精确定位问题。
延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常。
try-catch块影响jvm的优化,
异常对象实例需要保存栈快照等信息,开销较大,