一、 异常的概念
异常指的是运行期出现的错误,也就是当程序开始执行后执行期出现的错误。出现错误时观察错误名字和行号最为重要。
异常的概念
1) java 异常时java提供的用于处理程序中错误的一种机制
2)所谓错误是指程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。
3)设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。
4)java程序的执行过程中出现异常事件,可以生成一个异常类对象,该异常兑现跟风装了异常事件的信息并将被提交给java运行时系统(java运行时默认处理是直接把这个异常对象里面包装的信息打印出来)。这个过程称为抛出(throw)异常。
5)当java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常(catch)
二、异常分类
1)Error:称为错误,由java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。
2)Exception: 所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要显式的声明或捕获。
3)RuntimeException: 一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将他们交给缺省的异常程序(用户不必对其处理)。
三、异常的捕获和处理
java异常处理的五个关键字: try、catch、finally、throw、throws
任何方法往外抛能处理的异常的时候都有一种简单的写法:“throws Exception”,因为Exception类是所有能处理的异常类的根基类,因此抛出Exception类救护抛出所有能处理的异常类了。使用“throws Exception”抛出所有能被处理的异常之后,这些被抛出来的异常就是交给java运行时系统处理了,而处理的方法是把这些异常的相关错误堆栈信息全部打印出来。除了在做测试之外,在实际当中编程的时候,在main方法里抛Exception是一个非常不好的编程习惯,应该使用try…………catch去捕获异常并处理掉捕获后的异常。不能直接在main方法把Exception跑出去交给java运行时系统处理就完事了,这是一种不负责任的表现。如果想把程序写得特别健壮,使用try…………catch去捕获异常并处理掉捕获后的异常时必不可少的做法。
四、try…………catch…………finally
try {…………} 该段代码是捕获异常的代码
catch(Exception e){}
getmessage() 方法,用来得到有关异常事件的信息
printStackTrace() 方法,用来跟踪异常事件发生时执行堆栈的内容
我们一般使用printStackTrace()这个方法来打印异常信息,使用这个方法打印出来的是所有错误的信息,包括了使用getMessage()方法打印出来的信息。使用这个方法之前要new一个错误对象,才能调用它。因为它是专属于某个错误对象里面的方法。
finally语句
finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分前,能够对程序的状态作统一管理。
无论所指定的程序块中是否抛出例外,finally所指定的代码都要被执行。
通常在finally语句中可以进行资源的清楚工作。如:
关闭打开的文件
删除临时文件
。。。。
throw 与 throws 的区别:
throws 是用来声明一个方法可能抛出的所有异常信息
throw则是抛出的一个具体的异常类型。
通常在一个方法(类)声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后子啊对其进行相关的包装,最后在将包装后的异常信息抛出。
五、声明并抛出异常
class A{
public void method() throw IOException{…………}
}
class B extends A{
public void method() throws IOException(){…………}
}
重写方法需要抛出与原方法所抛出异常类型一致异常或不抛出异常。
六、使用自定义异常
1)通过集成java.lang.Exception类声明自己的异常类。
2)在方法适当的位置生成自定义异常类的实例,并用throw语句抛出(throw new AException() )
3) 在方法的声明部分用throws语句声明该方法可能抛出的异常。
七、小结
1)在一个try块中,基类异常的捕获语句不可以写在子类异常的捕获语句前面。
2)重写方法需要抛出与原方法锁抛出的的异常类型一致或者不抛出异常。