您的位置:首页 > 其它

异常处理

2015-08-27 09:15 211 查看
一、异常概述

1.什么是异常

异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。如程序试图打开一个不存在的文件、操作数组越界、将0作为除数等。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。

2.异常的分类

Java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception类和Error类。

Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类问题比较严重,一般不编写针对性的代码对其进行处理。

Exception类是所有异常类的父类,被称为非致命类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和除RuntimeException之外的异常。

RuntimeException是一类特殊的异常,被0除、数组角标越界等。产生比较频繁,处理麻烦,如果每次都处理,会对程序可读性和运行效率影响比较大,因此由系统检测并将它们交给缺省的异常处理程序,用户不必对其进行处理。这类异常不处理,编译时不会报错,只是在运行时出现错误时才报告异常,所以我们称之为运行时异常,所有RuntimeException的子类都是运行时异常。我们也可以对运行时异常进行处理。

Exception中除了RuntimeException的子类,其他异常都是必须要处理的,如果不处理,编译时会报错,这些异常我们称之为编译时异常。

二、捕捉异常

Java语言的异常捕获机构由try、catch、finally3部分组成。其中try语句块放的是可能发生异常的Java语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理的最后执行部分,无论try块中的代码如何退出,都将执行finally块。

在程序中可以在方法后面使用throws关键字声明向外抛出异常

try

{

需要被检测的代码;

}

catch(异常类 变量)

{

处理异常的代码;(处理方式)

}

finally

{

一定会执行的语句;

}

e.getMessage()函数:输出错误性质。

e.toString()函数:给出异常的性质和类型。

e.printStackTrace()函数:指出异常的类型、性质、栈层次及出现在程序中的位置(jvm默认的异常处理机制)。

完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之间的try-catch是否顺利执行完毕,都会执行finally语句。finally中存放的是一定会被执行的代码,通常用于关闭资源。

在以下4种特殊情况下,finally块不会被执行:

a.在finally语句块中发生了异常。

b.在前面的代码中使用了System.exit()退出了程序。

c.程序所在的线程死亡。

d.关闭CPU。

三、对多异常的处理

1.声明异常时,建议声明更为具体的异常,这样处理的可以更具体。

2.对方声明几个异常,就对应有几个catch块,不要定义多余的catch块。

3.如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

4.建立在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrace(),也不要简单的就书写一条输出语句。

四、 自定义异常

因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题,可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装。 用户可以通过继承Exception类来自定义一个异常, 如果要定义一个运行时异常则需要继承RuntimeException类。

在程序中使用自定义异常类,大体可分为以下几个步骤:

a.创建自定义异常类。

b.在方法中通过throw关键字抛出异常对象。

c.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

d.在出现异常方法的调用者中捕获并处理异常。

继承Exception原因:异常体系有一个特点,异常类和异常对象都被抛出。他们都具备可抛性,这个可抛性是Throwable这个体系中独有特点,只有这个体系中的类和对象才可以被throws和throw操作。

throws和throw的区别:

throws通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。

throw关键字通常应用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch代码块。throw通常用来抛出用户自定义异常。

五、异常在子父类覆盖中的体现

1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。

2.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集,不能抛出新异常。

3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。

4.如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: