- Java的基本理念是“结构不佳的代码不能运行”
- 改进的错误恢复机制是提供代码健壮性的最强有力的方式
- java使用异常来提供一致的错误报告模型,使得构件能够与客户端代码可靠的沟通问题
- 异常处理是java唯一正式的错误报告机制
12.1 概念
- 用强制规定的形式来消除错误处理过程中随心所欲的因素
- 它能够降低错误处理代码的复杂度
12.2 基本异常
-
异常情形是指阻止当前方法或者作用域继续执行的问题
除法是一个非常典型简单的例子,除数可能为0,所以先进行检查很有必要,假使这是一个意料之外的值,你也不清楚该如何处理,那就要抛出异常,而不是顺着原来的路径继续执行下去。 -
异常最重要的方面之一就是如果发生问题,他们将不允许程序沿着其正常的路径继续走下去。
12.2.1 异常参数
-
与使用java中其他对象一样,我们总是用new在堆上创建异常对象,这也伴随着存储空间的分配和构造器的使用。
所有标准异常类都有两个构造器:
一个是默认构造器;
另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器。 -
错误信息可以保存在异常对象内部或者异常类的名称来暗示,上一层环境通过这些信息来决定如何处理异常。(通常,异常对象中仅有的信息就是异常类型,除此之外不包含任何有意义的内容)
12.3异常捕获在这里插入代码片
12.3.1 try块
try{
//Code that might generate exception
}
这意味着代码将个容易编写和阅读,因为完成任务的代码没有与错误检查的代码混在一起
12.3.2 异常处理程序
每个catch子句(异常处理程序)看起来就像是接收一个且仅接收一个特殊类型的参数的方法。
终止和恢复
异常处理中理论上有两种基本类型:
java支持终止模型(常用);
另一种是恢复模型;
12.4 创建自定义异常
java中已经有无数的异常类型,但是我们还是会要用到自定义的异常类
-
最简单方法时让编译器为你产生默认构造器,这样不用写多少代码,也就是自定义异常类继承exception类即可,调用默认构造器;(编译器创建了默认构造器,它将自动的调用基类的默认构造器)
对异常来说,最重要的部分就是类名,所以创建调用基类默认构造器的异常类就够用了。 -
可以增加一个调用带string 参数的构造器,使用super关键字调用基类构造器,它接受一个字符串作为参数,在异常报错信息中会跟在异常类后面当做更详细的异常提示;
printStackTrace()方法,是Throwable类声明的方法,Excption继承他,自定义类继承Exception,所以这个方法也被自定义类所使用,它的作用便是:将打印“从方法调用出直到异常跑出处”的方法调用顺序。(异常报错信息都是这么显示的)
e.printstrackTrace();则信息将被输出到标准的错误流。
12.4.1 异常与日志记录
12.5 异常说明
- java鼓励人们把方法可能会抛出的异常告知使用此方法的客户端程序员。
- 在方法参数前用throws来说明方法中存在的异常
12.6 捕获所有的异常
Exception是所有异常类的基类,所以将捕获所有异常,最好把它放在处理程序列表的末尾,以防止抢在其他处理程序之前先把异常捕获了。
12.6.1 栈轨迹
栈:顾名思义有栈的特性,如子弹上膛先进后出
printStrackTrace()方法所提供的信息可以通过getStackTrace()方法来直接访问,这个方法将返回一个由栈轨迹中的元素组成的数组,每个元素表示栈中的一帧,如从main()方法开始知道报错的具体方法,这过程的所有方法都将组成栈元素;
Java标准异常
Throwable这个Java类被用来表示任何可以作为异常被抛出的类。
子类有两种:Error(表示编译时和系统错误)和Exception(是可以被抛出的基本类型)
java程序员关系的基类型通常是Exception.
-
对于异常来说,关键是理解概念以及如何使用;
-
异常的基本概念是用名称代表发生的问题。并且异常的名称应该可以望文知意。
12.7.1 特例 RuntimeException
运行时异常,他们会自动被java虚拟机抛出,如空指针异常和数组下标越界异常,这些都是继承自运行时异常,不需要我们去捕获和处理;
如果不捕获的话,运行时异常直达main(),程序在退出前将调用异常的printStackTrace()方法。(栈轨迹)
运行时的异常代表的是编程错误:
1、无法预料的错误,比如外界传进来的null
2、作为程序员,应该在代码中进行检查的错误,(如数组下标越界异常,就得注意一下数组的大小了)