天天看点

【Java Exception vs Error】细谈java中异常机制

java.lang.Error和java.lang.Exception都是实现了Throwable接口,整个的继承关系如图:

【Java Exception vs Error】细谈java中异常机制

1.Error

Error是java虚拟机内部的错误,是由于java虚拟机缺少某种系统资源导致的。 这是比较严重的错误,是不能通过编码避免的,也不能使用try-catch-finally代码块来捕获,编译器也不会进行检查。程序出现Error时唯一的办法就是终止程序。

例如:StackOverFlowError(栈溢出错误)。是由于程序在运行过程中java虚拟机的虚拟栈机空间溢出导致的。虚拟机栈是程序运行时jvm保存方法中的变量的内存空间,使用栈的数据结构进行存储。当栈中压入过多的变量导致栈空间不够,就会发生这种错误。

2.Exception

与Error不同,Exception是由程序带来的异常,所以在代码中必须添加约束进行避免或者在发生异常时进行处理。当程序中进行了避免或者使用try-catch-finally代码块进行了处理,发生异常时就可以保证程序正常运行,不会终止。Exception按编译器是否进行检查可分为CheckedException(检查型异常)和UnCheckedException(非检查型异常)。

2.1 CheckedException(检查型异常)

检查型异常是指编译器会进行检查的异常,也就是让开发者事先给出发生这种异常时的处理办法。首先这类异常跟代码是否有问题无关,并且不是通过编码就能避免的,但却是在运行时可能发生的,开发者只能通过事后挽救的方式来处理,即通过try-catch-finally代码块进行捕获处理。

例如:FileNotFoundException(文件未找到异常)。这种异常是由于文件不存在导致的,跟程序是否正确没有关系,并且无法避免,只能对这种异常进行捕获,然后给出处理方法(例如将异常写入日志或者给用户一个提示框)。

2.2 UnCheckedException(非检查型异常)

非检查型异常是指编译器不会进行检查的异常。非检查型异常又称为RuntimeException(运行时异常,即运行时才会知道这种异常会发生)。这类异常一般是由于代码有问题导致的,开发者需要在程序中避免发生这种异常,所以一旦发生这类异常就代表这代码有缺陷。另外,由于编译器不会强制要求进行捕获处理,并且程序中也不应该进行捕获处理,所以一旦该类异常发生且没有被捕获,就会导致程序终止。

例如:ArrayIndexOutOfBoundsException(数组越界异常),这是由于程序中访问了不属于数组范围内的元素导致的,这种异常是应该在代码中避免的,如果发生了,那就是代码有Bug。