“异常”代表程序运行中遇到了意料之外的事情,为了表征异常,Java标准库中内建了一些通用的异常,这些类以 Throwable为父类。而 Throwable又派生出 Error类和 Exception类两大子类。
- Error及其子类,代表了 JVM自身的异常。这一类异常发生时,无法通过程序来修正。最可靠的方式就是尽快停止 JVM的运行。
- Exception 及其子类,代表程序运行中发生了意料之外的事情。这些意外的事情可以被 Java异常处理机制处理。而 Exception类及其子类又可以划分为两大类:
????????????????-RuntimeException及其子类:这一类异常其实是程序设计的错误,通过修正程序设计是可以避免的,如数组越界异常、数值异常等。
????????????????-非RuntimeException及其子类:这一类异常的发生通常由外部因素导致,是不可预知和避免的,如 IO异常、类型寻找异常等。
在遇到复杂的类间关系时,绘制它们的 UML 类图是厘清它们之间关系的非常好的手段。很多时候,在绘制 UML类图的过程中,你就会对它们之间的关系豁然开朗。
Error及其子类代表JVM出现异常,且无法通过软件修复;RuntimeException 及其子类是程序设计的错误,可以在编写程序时避免。以上这两大类异常称为免检异常,即不需要对这两类异常进行强制检查。而除上述两类异常外的其他异常,它们的发生与外部环境有关,称为必检异常。在编写程序时必须用 try、catch 语句将其包围起来。
对于 Throwable对象,其主要的成员变量有 detailMessage和 cause。
- detailMessage为一个字符串,用来存储异常的详细信息。
- cause 为另一个 Throwable 对象,用来存储引发异常的原因。这是因为一个异常发生时,通常引发异常的上级程序也发生异常,从而导致一连串的异常产生,叫作异常链。一个异常的 cause属性可以指向引发它的下级异常,从而将整个异常链保存下来。
其实异常就是一种程序的通知机制,当程序发生了无法自动修复的情况时,需要提示异常,这时候就需要人为的干预和处理,另外对于一些非RuntimeException的异常,就是底层API已经定义好了显示声明抛出这种异常,所以在外围调用这些方法的使用者就必须要显示的处理这种异常,或者将异常再抛出到外城。
|