一、异常的概念和Java异常体系结构
异常是程序运行过程中出现的错误。Java语言的异常处理框架, 是Java语言健壮性的一个重要体现。
Java异常体系结构呈树状
通过结构图我们可以清楚的知道,java 异常的组成原理。throwable是异常的父类,他下面有两个子类,error和Exception。
error:程序无法处理的错误,比如像OutOfMemoryError、ThreadDeath等。这些异常发生时, Java虚拟机(JVM)一般会选择线程终止。
Exception:是程序可以处理的异常类。他又分为运行时异常RuntimeException和非运行时异常,也指非检查异常和检查异常。
2.运行时异常和非运行时异常
运行时异常不需要程序处理的异常,比如NullPointerException、IndexOutOfBoundsException等, 程序可控制,但是控制时请详细查看是否影响程序混乱、健壮性等问题。
非运行时异常是需要程序必须处理的异常,如果不处理,代码会编译不通过,像IoException、SqlException、自定义异常等。
二、异常的捕获和处理
Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。下面将骤一介绍,通过认识这五个关键字,掌握基本异常处理知识。
1. try、catch、finally
try{
//(尝试运行的)程序代码
}catch(异常类型 异常的变量名){
//异常处理代码
}finally{
//异常发生,方法返回之前,总是要执行的代码
}
注意事项:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;(finally没有return)
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
2.throw、throws关键字
throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,
则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。
如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。
如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。
throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,
该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,
而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。
三、异常的转译与异常链
Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。此 cause 设施在 1.4 版本中首次出现。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。
下面来举个简单例子:
public class DAOException extends RuntimeException {
/(省略了部分代码)
public DAOException(String message, Throwable cause) {
super(message, cause);
}
DAOException daoEx = new DAOException ( "SQL异常", e);
这里e可以传sqlException或者其他异常,这就是所谓的异常链。
当程序捕获到了一个底层异常le,在处理部分选择了继续抛出一个更高级别的新异常给此方法的调用者。
这样异常的原因就会逐层传递。这样,位于高层的异常递归调用getCause()方法,就可以遍历各层的异常原因。
这就是Java异常链的原理。异常链的实际应用很少,发生异常时候逐层上抛不是个好注意,
上层拿到这些异常又能奈之何?而且异常逐层上抛会消耗大量资源,
因为要保存一个完整的异常链信息.
四、设计一个高效合理的异常处理框架
对于一个应用系统来说,发生所有异常在用户看来都是应用系统内部的异常。因此应该设计一套应用系统的异常框架,
以处理系统运行过程中的所有异常。
基于这种观点,可以设计一个应用系统的异常比如叫做AppException。并且对用户来说,
这些异常都是运行应用系统运行时发生的,因此AppException应该继承RuntimeException,
这样系统中所有的其他异常都转译为AppException,当异常发生的时候,前端接收到AppExcetpion并做统一的处理。
画出异常处理框架如图 3 :
图 3 一个应用系统的异常处理框架
在这个设计图中,AppRuntimeException是系统异常的基类,对外只抛出这个异常,
这个异常可以由前端(客户端)接收处理,当异常发生时,客户端的相关组件捕获并处理这些异常,
将"友好"的信息展示给客户。
在AppRuntimeException下层,有各种各样的异常和错误,最终都转译为AppRuntimeException,
AppRuntimeException下面还可以设计一些别的子类异常,比如AppDAOException、OtherException等,
这些都根据实际需要灵活处理。
在往下就是如何将捕获的原始异常比如SQLException、HibernateException转换为更高级一点AppDAOException。
有关异常框架设计这方面公认比较好的就是Spring,Spring中的所有异常都可以用org.springframework.core.NestedRuntimeException来表示,并且该基类继承的是RuntimeException。
Spring框架很庞大,因此设计了很多NestedRuntimeException的子类,还有异常转换的工具,
这些都是非常优秀的设计思想。
五、 Java异常处理总结
回顾全文,总结一下Java异常处理的要点:
1、异常是程序运行过程过程出现的错误,在Java中用类来描述,用对象来表示具体的异常。
Java将其区分为Error与Exception,Error是程序无力处理的错误,Exception是程序可以处理的错误。
异常处理是为了程序的健壮性。
2、 Java异常类来自于Java API定义和用户扩展。通过继承Java API异常类可以实现异常的转译。
3、异常能处理就处理,不能处理就抛出,最终没有处理的异常JVM会进行处理。
4、异常可以传播,也可以相互转译,但应该根据需要选择合理的异常转译的方向。
5、对于一个应用系统,设计一套良好的异常处理体系很重要。这一点在系统设计的时候就应该考虑到。
相关推荐
### Java异常处理总结 #### 一、Java异常的基础知识 在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么...
### Java异常总结 #### 一、Java异常概述 在Java编程语言中,异常处理机制是一项非常重要的特性。它提供了一种方法来响应错误条件,并且能够有效地管理程序运行时可能出现的各种异常情况。Java中的异常主要分为两...
下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出异常的关键字是 `throw`。 * `try`、`catch` 和 `finally` 是 Java 异常处理的三个主要组成部分。 二、异常处理机制 *...
### Java常见异常总结 在Java开发过程中,遇到各种异常是在所难免的。为了更好地理解和处理这些异常,本文将详细介绍几种常见的Java异常类型及其处理方法。 #### 1. `java.lang.NullPointerException` - **异常...
### JAVA自定义异常类 #### 一、基本概念与应用场景 在Java编程中,异常处理是一种重要的机制,用于处理程序运行时可能出现的各种错误情况。Java提供了丰富的内置异常类,但有时候,内置的异常类可能不足以精确地...
### Java异常学习总结 #### 一、Java异常概述与分类 在Java开发中,异常处理是确保程序稳定性和健壮性的关键部分。本篇总结了Java异常的基本概念、分类及处理方式等内容,对于从事Java开发的技术人员具有重要的...
Java 异常种类总结 Java 异常种类总结是指在 Java 编程语言中,各种可能发生的异常类型的总结。这些异常可能会在编程过程中出现,并且可能会导致程序的崩溃或中断。了解这些异常种类可以帮助开发者更好地处理和解决...
Java异常处理总结.pdf
当使用`throw`时,需要提供一个异常实例,这可以是预定义的Java异常类,如`NullPointerException`或`IOException`,也可以是自定义的异常类。一旦`throw`语句被执行,程序的正常流程会被中断,控制权会立即传递到...
以下是对Java异常处理的一些误区和经验总结。 **误区一:过度使用try-catch块** 有些开发者习惯于在每个函数的开始部分都套用try-catch块,以为这样可以捕捉所有可能出现的异常。实际上,这种做法使得代码变得混乱...
总结,Java异常框架是保证程序健壮性和可维护性的重要部分,它提供了优雅的方式来处理错误情况,同时允许代码的结构保持清晰。对于Web服务开发,如使用Jersey,异常处理更加关键,因为它直接关联到对外接口的响应...
### 常见JAVA异常总结 #### 1. `java.lang.NullPointerException` `java.lang.NullPointerException` 是一种运行时异常,表示程序试图在需要对象的地方使用了 `null`。例如,通过对 `null` 引用调用实例方法或访问...
### Java的异常类详解 #### 一、概述 在Java编程中,异常处理是一项非常重要的技术,它能够帮助开发者有效地管理程序运行时可能出现的各种错误情况。Java中的异常类主要分为两大类:`Error`和`Exception`。前者...
Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本实验报告“java实验报告4-异常处理”旨在帮助初学者掌握Java中的异常处理机制,以及如何利用log4j进行日志...
Java核心技术包括Java语言基础、Java面向对象编程、Java异常处理、Java多线程编程等。Java语言基础包括Java语法、Java基本数据类型、Java运算符、Java控制结构等。Java面向对象编程包括类、对象、继承、多态、封装、...