基于JAVA常见异常处理研究
2016-08-23李婷玉
李婷玉
摘 要:程序设计语言的重要标志就是异常处理机制,用来对程序运行在程序设计过程中出现的异常情况进行处理。异常处理在传统的程序设计语言里十分的复杂,Java不仅将异常处理机制引进来,作为程序设计语言,它还面向对象。异常处理如果做到合理完备,不仅可以使软件的健壮性以及程序运行的可靠性大为增加,还可以对错误的位置进行快速的确定。
关键词:Java;异常处理;处理原则
一、前言
编程不出错是保证程序正常运行的基础,但编程出现异常却是经常的事。Java包括了三类错误:语法错误、运行错误、逻辑错误。Java的对象极为广泛,是面向对象的程序设计语言。在编程的时候,如果有应对程序异常的机制,编程就可减少错误代码所造成的损失。本文提供了处理异常的机制及原则,可给编程人员减少大量的工作。
二、Java异常处理机制
程序运行错误会引起异常。没有异常捕获和处理代码的程序会非正常终止,并可能引起严重问题。在编程的时候,如果用面向对象的方法处理异常,就必须建立类的层次。而在Java中,Throwable是所有可以通过throw抛出或catch捕获错误的基类。Throwable类有两个直接子类:Error类和Exception类。Error类由Java虚拟机抛出,描述内部的系统错误,如虚拟机错误、装载错误、动态连接错误、GUI实时系统的严重错误,这类错误很少发生,如果发生,除了通知用户以及尽量稳妥地结束程序以外,几乎什么也不能做。究其原因,与电脑的硬件及运行系统有关,大多跟程序的编写并无关系,所以,不比用程序去捕捉(在极为特别的条件下,也要用程序去捕捉)。Exception类描述由程序和外部环境引起的错误,这些错误能通过程序捕获和处理。在编程时,程序出现的大部分异常可由Throwable或者所包含的子类去表示,这种表示可传递发生点与连接点之间的程序。程序中的异常捕捉可由try语句中的catch来建立。在处理程序异常的整个过程中,Java VM把线程中尚在运行的语句、方法、表达式和域初始化表达式给终止掉。此过程会处在不断活动中,只有当出现异常句柄时才会终止,同时会弹出所处理异常的类来表示它已处理异常。如若未弹出这样的句柄,就要用另外一种方法来处理该异常,即调用父线程Thread Group的方法uncaught Exception,以此来处理潜在的异常,此方法能够处理绝大部分的异常。
三、异常处理的原则
Java异常处理结构由三部分组成,包括try、catch和finally。其中try块以关键字try开始,后面跟由花括号({})括起来的语句块,其中包括可能抛出异常的语句;catch块以关键字catch开始,后面跟圆括号中的异常参数和花括号中的处理异常的语句块;finally块包含清除程序没有释放的资源等。在程序中,不管try块以何种方式退出,最终都要流入finally块,执行finally块的代码。Java通常在处理异常时有声明异常、抛出异常及捕捉异常等三种处理模式。
(一)创建与抛出异常
在程序的编写中,程序不能正常运行时,窗口会创建和跑出异常。在Java中,能够实现不在方法中直接捕获,而是在Throw语句中将异常抛给上层。Throw的最大作用在于能够明确地抛出异常;在这个过程中,要以Throwable的实例句柄为基础,利用参数传到catch语句中(也可以用new语句进行创建)。
Throw:通常情况下,异常捕捉的实现都是靠系统来完成的,在实际编程中也可以通过throw语句来跑出异常。throw语句的格式为:throw new异常类名(信息)。其中异常类名为系统异常类名或用户自定义的异常类名,“信息”是可选项。称为异常信息,可以使用get Message()获得。
throws:在编程中,如果由一个方法引发的异常,并且自身无处理功能,那么编程者就要指明该异常,并且运用调用者来处理该异常。Throws还有一个重要的功能,就是标出方法中的所有异常。Runtime Exception、Error以及它们的子类都称为免检异常。除Runtime Exception、Error(包括它们的子类)以外的所有异常都称作必检异常,必检异常是指编译器会强制编程人员检查异常并处理这些异常。为避免过多地使用try-catch,Java语言不允许编写捕获或者声明免检异常的代码。所以在程序中如果想通过方法来引发Exception或除Runtime Exception之外的其子类,就需要throws语句来显示异。
(二)捕获异常
在程序的编写中,方法语句如果要抛出异常,在此先假设异常能被捕捉并最终被处理。这种假设的好处在于预先在专注于正在解决的问题,然后在别的地方处理这些代码中的错误。
在运行时,一个try子句或许会抛出许多种异常,正因为此,在catch的定义中,就要求对catch进行多重定义,以对多个异常进行捕捉。一般情况下,一个catch语句只能捕捉一个异常,如果要catch语句捕捉多个异常,它就要满足以下三个条件的任何条件之一:
(1)其他异常与该异常的参数相同
(2)其他异常的子类的参数与该异常或者其子类的参数相同
(3)异常实现参数所定义的接口。
如若所有的catch语句跟系统所抛出的异常都不匹配,则当前的方法不能处理该异常,系统的程序流程将回到该方法的上层方法,如果这层方法中catch的定义与该异常相匹配,异常将被处理;如果这层的方法中找不到相匹配的catch语句,则由Java来处理这个异常。遇到这种情况,系统通常会终止程序的运行,退出,退出虚拟机返回操作系统,在标准上打印相关的异常信息。
(三)finally的应用
Java对垃圾的回收是通过对系统的释放和回收来实现的(内存之外的资源例外)。想恢复内存之外的资源就要回到初始状态,在此就要用到finally语句。在打开诸如网络连接、图片或者文件时,程序在运行时都有可能抛出异常(并且没有被捕捉),资源就有可能不能被释放。这种情况下,就要使用finally语句,在finally语句中可以把要释放的资源写在其中,不论try有没有抛出出异常,finally子句能够在回收机制发生作用前得到执行,确保资源正确释放。
在编程中,Java对异常的处理有着重要的作用,是编写程序、开发软件不可或缺的部分,但在实际编程中却经常被忽视。本文分析了异常的处理机制及原则,对异常的处理有着积极的作用,很大程度上提高了系统的安全性和稳定性,也提高了编程、开发软件的效率,有效节省了人力物力。
参考文献:
[1] 朱丹丹.刍议Java动态类加载机制研究与应用[J]. 电子技术与软件工程. 2016(07)
[2] 张祎.项目教学法在java教学中的应用初探[J]. 职业教育与区域发展. 2016(01)
[3] 于守良.关于Java面向对象程序设计课程的思考[J]. 中国教育技术装备. 2013(15)