异常处理

来源:互联网 发布:淘宝店铺首页显示不全 编辑:程序博客网 时间:2024/04/26 07:50

所谓异常,就是以对象的方式表示一个或一类错误,该异常对象不仅封装了错误信息,还包含了错误发生时的“上下文”信息。传统的错误处理方式是,每当程序调用了某个方法进行了某种操作,程序应该立即检查该方法的返回值,判断是否有错误发生。若有错误发生,通常要访问一个全局变量如 err 来获取具体的错误·代码,以得到进一步的错误信息。在Java中,这种传统的处理方式仍然有效,但是Java从c++中继承了以面向对象的方式处理错误机制,并做了进一步改进。

在Java中,任何异常对象都是java.lang.Throwable类或其子类的对象Throwable类是Java异常类体系中的根系,它有两个子类:一个是Error 类,另一个是Exception类。Error类及其子类的对象,代表了程序运行是Java系统内部的错误,这样的错误程序员一般不用关心。Exception 类及其子类的对象是程序员应该关心并尽可能加以处理的,Exception类有许多的子类,其中如 RuntimeException 类表示Java程序运行时错误,如数组下表越界、对象类型强制转换错误、空指针访问错误等。

所有异常分为两类:必须要检查的异常(checked exceptions)和非检查的异常(unchecked exception)。Error 和 RuntimeException 类及其子类都属于unchecked exceptions ,表示编译器在编译程序时对这类异常不做检查。Exception 类及其子类(RuntimeException除外)属于checked execptions,便、编译器在编译程序时,要检查程序是否对这类异常做了处理(如try 捕获或throws 声明抛出异常),若没有处理,则编译器会报错,要求对此必须进行处理。

异常的捕获与处理

Java中使用try-catch-finally 语句来捕获并处理异常,try-catch-finally 语句的语法格式如下:

try{//可能会产生异常的程序代码}catch(Excption_1 e1){//处理异常Exception_1 的代码}catch(Exception_2 e2){//处理异常Exception_2的代码}……catch(Exception_n en){//处理异常Exception_n的代码}finally{//通常是释放资源的程序代码}
整个语句由try语句块、catch语句块和finally语句块三部分组成。catch语句块和finally语句块都是默认的,但是Java规范不允许两者同时默认。

(1)try语句块

将可能产生的异常的程序代码放在此处,该段代码是程序正常情况下应该要完成的功能。在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句块要分别对这些异常做相应的处理。

(2)catch语句块

每个catch语句块声明其能处理的一种的特定类型的异常并提供处理的方法。当异常发生时,程序会中止当前流程,根据获取异常的类型去执行相应的catch语句块。在catch中声明的异常对象封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法来获取这些信息。例如下面的方法:

getMessage(): 用来得到有关异常事件的信息

printStackTrace():用来跟踪异常事件发生时执行堆栈的内容。

(3)finally语句块

无论try所指定的程序块是否抛出异常,finally所指定的代码都要被执行。finally语句为异常处理提供一个统一的接口,使得在控制流程转到程序的其它部分以前,能够对程序的状态作统一的管理。通常在finally语句中进行资源的释放工作,如关闭打开的文件,删除临时文件等。

try-catch-finally语句的语义:

首先执行try语句块中的代码,若一切正常,则跳过catch语句块,执行finally语句块中的代码,执行完后,整个try-catch-finally语句才算执行完成。若执行try语句块时产生异常,则立即跳转到catch语句块。Java虚拟机会把实际抛出的异常对象一次和各个catch语句块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的对象,就执行这个catch语句块,而不会在执行其它的catch语句块,之后跳转到finally语句块,再执行完finally语句块,该语句才算执行完成。

package javademo;import java.io.*;public class UseException {public static void main(String[] args) {// TODO Auto-generated method stubtry{int a,b;a = Integer.parseInt(args[0]);b = Integer.parseInt(args[1]);System.out.println(a+"/"+b+"="+(a/b));}catch(ArithmeticException e){System.out.println("捕获一个异常,除数不能为0!");}}}
声明抛出异常子句

声明抛出一个异常子句,只能加在方法头部的后面,语法格式如下:

throws<异常列表>

例如,public int read() throws IOException{……}

若一个方法声明抛出异常,则表示该方法可能会抛出所声明的那些异常,从而要求该方法的调用者,在程序中对这些异常加以注意和处理,比如用try-catch-finally语句来处理。

若一个方法没有声明抛出异常,则该方法仍可能会抛出异常,只不过这些异常不要求调用者加以注意。时、即使一个方法声明抛出异常,则该方法仍可能会抛出不在异常列表之中列

出的异常。通常异常列表中的异常,都要求调用者要在程序中明确加以处理的。方式可以是用try-catch-finally语句捕获处理。


原创粉丝点击