概念
“程序运行时,经常会出现一些非正常的现象,如死循环、非正常退出等,称为运行错误。根据错误性质将运行错误分为两类:错误(Error)和异常(Exception)”
Error一般由系统进行处理,程序本身无需捕捉和处理,只能通过提示Error信息检查、改正程序。
Exception(除数为0或操作数超出数据范围等)是在程序运行(而非编译)期间可能出现的现象,通过在程序中加入异常处理代码,使得产生异常时可执行该代码段调整程序运行方向,此过程称为异常处理。
我们总希望错误被发现、处理的越早越好,但有的错误只有在运行时才会发生,因此需要在程序中加入捕获、处理异常的代码,使得系统健壮性有所体现。
分类
Java语言采用面向对象的机制来处理异常。类之间结构为:
所有的异常类均继承自Throwable类,Throwable类继承自Object类,可见Java对异常控制是非常重视的。Throwable封装了异常类所应具备的基本方法:
getMessage()返回异常的具体描述信息
getStackTrace()返回异常的堆栈信息
printStackTrace()打印异常的堆栈信息。
Error:系统内部错误
Exception:可以处理的异常
RuntimeException:不必try...Catch
其他非运行异常子类:必须catch的Exception(API帮助中方法后面Throws的异常类)
处理
一般说来,系统捕获抛出的异常并输出相应的信息,同时终止程序运行,导致其后程序无法运行。我们需要让程序接收和处理异常对象,从而不影响其他语句的执行,使程序更加严谨,防止数据库结构泄。这些就是捕获异常的意义所在。
使用try-catch-finally语句捕获和处理异常:try语句块将有可能抛出一个或多个异常对象的方法包含起来,出现异常时进行捕获;catch语句可以有多个,分别处理不同类的对象,当出现异常时,Java运行时系统将从上往下依次查看catch语句处理类型是否与抛出类型一致,进而执行catch语句块内容,因此在捕获异常时,异常类之间存在继承关系,则应将子类的catch语句块放置到父类的catch语句块之前;无论try语句块的内容是否抛出异常,finally语句块内容始终都会得到执行,因此finally语句块通常进行资源清理工作(关闭打开文件、删除临时文件等)。
使用throw语句可以在程序中主动抛出异常。
使用throws关键字在方法声明中表示该方法将抛出异常,格式如下:
[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
一个方法抛出异常后,系统将异常向上传播,由调用他的方法来处理这些异常或继续向上传播。
自定义异常类,Java可通过创建Exception的子类来创建异常类,创建自定义异常类可考虑以下几点:
1.Java异常类体系中不包含所需要的异常类型。
2.用户需要将自己所提供类的异常与其他人提供的异常进行区分。
3.类中将多次抛出这种类型的异常。
4.如果使用其它程序包中定义的异常类,将影响程序包的独立性与自包含性。
比较.NET异常处理
Java与.NET在异常处理的本质上是没有区别的,但在其语法表现上仍然需要区分:在.NET中没有throws语句,无需在声明方法时标出异常。
.NET中的异常分为两类:
1.程序执行所发生的异常,派生于ApplicationException类
2.公共运行库引发的异常,派生于SystemException类
这里异常处理机制同样也很简单,对可能出现异常的部分进行捕捉、处理,如果不能在当前处理,可通过throw抛出异常,交由调用者进行处理。
总结
异常处理是在今后工作中不可或缺的一项技能,在这里不能一一的分析每个异常类出现的处理方式,只能在具体问题中具体处理,而API帮助文档,是我们不可或缺的工具,相信随着经验的不断积累,对异常问题的处理也会变得越来越灵活,程序实现也更加健壮。