Java中如何对各类异常进行有效分类与处理?

摘要:Throwable 是 Java 语言中所有错误或异常的超类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。实例分为 Error 和 Exception
Throwable 是 Java 语言中所有错误或异常的超类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 实例分为 Error 和 Exception 两种。 其中,AWTError GUI图形界面化编程相关异常。 Error(错误)   是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。   这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。 Exception(异常) 是程序正常运行中,可以预料的意外情况,但属于程序可以处理的异常情况。比如数据库连接中断,空指针,数组下标越界。异常出现可以导致程序非正常终止,也可以预先检测,被捕获处理掉,使程序继续运行。EXCEPTION(异常)按照性质,又分为编译异常(可检测)和运行时异常(不可检测)。 编译时异常:又叫可检查异常,通常时由语法错和环境因素(外部资源)造成的异常。比如输入输出异常IOException,数据库操作SQLException。其特点是,Java语言强制要求捕获和处理所有非运行时异常。通过行为规范,强化程序的健壮性和安全性。如果不处理,程序就不能编译通过。 运行时异常:又叫不检查异常RuntimeException,这些异常一般是由程序逻辑错误引起的,即语义错。比如算术异常,空指针异常NullPointerException,下标越界IndexOutOfBoundsException。运行时异常应该在程序测试期间被暴露出来,由程序员去调试,而避免捕获。Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。 运行时异常和编译时异常之间的区别:是否强制要求调用者必须处理此异常。如果强制要求调用者必须进行处理,那么就使用编译时异常(IDE一般会提示);否则就选择运行时异常(RuntimeException)。一般来讲,如果没有特殊的要求,建议使用RuntimeException异常。 Error和Exception区别 Error通常是灾难性的错误,因为发生该错误的时候,程序是无法控制的,JVM会选择终止线程; Exception通常是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。 异常能被程序本身可以处理,错误是无法处理。 Java异常处理机制 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。 捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。 对于运行时异常、错误或可查异常,Java要求的异常处理方式有所不同: 对运行时异常:由于运行时异常的不可查性,为了更合理更容易地运行程序,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。 对于错误:对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。 对编译异常:对于所有的可查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。
阅读全文