error和Exception的区别

 

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的优化,

异常对象实例需要保存栈快照等信息,开销较大,