8.1 什么是异常
扫码看视频
我们先看一段代码,如代码8.1所示。
这段代码很简单,在ExcepTest类中定义了一个实现整数除法运算的divide方法,在main方法中调用ExcepTest对象的divide方法,除数传递的是0,但是,我们都知道在除法运算中,除数是不能为0的。编译并运行该程序,程序果然报错,如图8-1所示。
图8-1 除数为0引发的异常
从图8-1中可以看到,有一个java.lang.ArithmeticException类,这是一个异常类,代表了发生的一类错误,在类名后面给出了异常的描述信息:“/ by zero”。在Java中,打开一个不存在的文件、网络连接中断、数组下标越界、正在加载的类文件丢失等都会引发异常。如果Java程序在执行过程中出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。Java运行时系统接收到异常后,会将异常对应的类名称、异常的描述、异常发生的位置跟踪信息都输出到System.err中,并终止程序的运行,如图8-1中所示。
Java中的异常类都是从java.lang.Exception类直接或间接派生而来的,而这个类又是从java.lang.Throwable继承而来的,图8-2展示了异常类的层次结构。
图8-2 异常类的层次结构
当然,Java中的异常类有很多,并不仅限于图8-2中给出的这少数几个,这里只是给出了大致的继承体系结构。
从图8-2中可以看到,从Throwable继承的还有一个Error类,这个类定义了程序中不能恢复的严重错误,如内存溢出、类文件格式错误等。这一类错误由Java运行时系统处理,不需要我们去处理,我们也没有能力去处理。若发生这一类错误,程序就只能无奈地终止。
Exception这一分支定义了程序中遇到的“轻微”错误,这些错误是可以被捕获并进行处理的,从而让程序可以继续运行。