文档介绍:第七章异常处理
本章导读
对于计算机程序来说,错误和异常都是不可避免的。Java提供了丰富的错误及异常情况处理措施,对各种可能出现的异常都作了充分的考虑,可以说,从没有哪一种语言象Java这样对异常考虑的这样周全。作为一门面向对象语言,Java把它对异常的处理都封装到类里。
在本章中,您将学****到以下关于异常处理的内容:
Java中异常处理的方式
Java中的异常类
如何抛出异常
如何捕获并处理异常
如果您用过C++,您会对Java的异常处理感到非常熟悉。下面我们就来介绍它。
在程序运行的过程中,存在着这样那样的发生错误的可能。这些错误可能是由于包含不合法的信息的文件所造成的,可能是由于不稳定的网络连接造成的,或者是数组越界存取,还可能是因为妄图使用空引用来引用对象。当这些错误发生时,我们通常希望程序能够智能的处理这些错误,而不会导致系统的崩溃或数据的丢失,例如我们希望程序在错误发生之后能够做到:
返回一个正常的状态从而可以继续执行其它的命令;
或者
允许用户保存他们的数据,然后放心的关闭程序。
我们的愿望是好的,但是往往事违人愿。通常当系统检测到错误发生时,程序已经“病入膏肓”了,不能再返回到正常的状态,也无法恢复已经破坏了的数据。因此错误处理的任务就是将错误从发生地传递到能够处理它的地方。要想在程序中处理错误,就需要了解一下到底可能发生哪些错误。我们概括一下,程序中可能出现以下错误:
用户输入错误——比如用户输入了错误的数据格式,这时您需要在程序中处理它,通常这种错误比较容易处理,而且不会对系统造成“灭顶之灾”。
设备错误——指硬件不能正常工作的错误,比如打印机不工作,串口找不到,甚至硬盘损坏。这种错误有些很致命。
物理限制导致的错误——比如磁盘空间满,内存不足。
代码错误——方法不能被正确的执行。这类错误是最常见的错误,比如数组越界访问,除零错误等。
有些错误是能够检查出来的或者可以预见的,比如因为程序代码本身的原因造成的错误,这些错误在经过程序员的仔细检查之后,在理论上是有可能避免的。然而还有一些错误是不可预测的,比如内存不足,文件操作的错误等等。这种错误不是程序本身的错误,是和程序运行的环境有关系的。
在传统的非面向对象的编程语言中,错误处理的任务全在程序员身上,程序员必须考虑在程序中可能出现的种种问题,并且自行决定如何处理这些问题。这样做有两个缺点,一是编程人员的负担过重,二是出错处理不规范,每个程序员都有自己的一套处理错误的****惯,这样就不利于程序员之间的合作,而且降低了程序的可读性。在传统的错误处理中,通常采用返回一个特定错误代码值的方式来标识错误,并由它的调用者来处理错误,这样对于调用者和被调用者来说都很麻烦。如果调用者不能处理这个错误还需要向它的上一级传递,这样当在调用者中可能出现两个错误的时候,这种传递方式就会变得非常笨拙;而且调用者有的时候会懒于处理这些错误而听之任之,从而种下了错误的隐患;另外,这种处理方式将程序的正常执行的代码和处理错误的代码混杂在一起,降低了程序的可读性。当然,这种方法还是有一定的作用的,在
Java中,有些地方仍然沿袭了这种传统的处理方法,比如某些I/O操作,如果失败了,就会返回一个空引用null。
在Java中使用异常为程序提供了一种有效的错误处理的方式,使得方法的异常中止和错误处理有了一个清晰的接口。异常处理的方式和传统的方式有所不同,它的基本处理方式是:当一个方法引发一个异常之后,可以将异常抛出,由该方法的直接或间接调用者处理这个异常。这就是我们常说的catch-throw(捕获-抛出)方式。这种处理方式使得错误的处理变得规范化,程序员可以用一致的方式来处理错误。
Java是一门面向对象的编程语言,因此,异常在Java中也是作为类的实例的形式出现的。Java中的所有的异常类都是从Throwable类派生出来的。图7-1是Java中异常的类层次图。
图7-1 Java中异常类的层次图
从图7-1可以看到,Throwable类有两个直接子类——Error和Exception。Error类及其子类主要用来描述一些Java运行时刻系统内部的错误或资源枯竭导致的错误,普通的程序不能从这类错误中恢复。您不能抛出这种类型的错误。这类错误出现的几率是很小的。
另一个异常类的分支是Exception类和它的子类们。在编程中,您对错误的处理主要是对这类错误的处理。类Exception是普通程序可以从中恢复的所有标准异常的超类。
Exception类又有两个分支——从RuntimeException中派生出来的类和不是从RuntimeException类中派生的类,这样分类的根据是错误发生的原因。RuntimeEx