程序运行过程中难免会发生各种非正常情况,即产生异常。在Java中,以类的形式对现实问题进行描述,形成异常类,当发生异常时即产生对应异常类的对象。例如,发生空指针异常、找不到文件、参数非法等都会抛出异常对象。异常的出现干扰了正常的指令流程,如果异常没有被处理,程序就会非正常终止。
【例5-1】
举例演示异常的产生。
步骤1:新建一个项目chapter5,在src目录下定义一个cn.linaw.chapter5.demo01包,包里定义一个工具类My Math1,类里定义一个整数相除求商的静态成员方法,如图5-1所示。
图5-1 My Math1类
步骤2:通过一个测试类My Math1Test1来演示产生一个异常,如图5-2所示。
图5-2 调用divide方法产生异常
从运行结果可以看出,程序发生了异常,程序非正常结束。从异常信息看,程序发生了一个被0除的算术异常(Arithmetic Exception),同时给出了异常产生的位置。本例异常是由于程序第5行调用My Math1类的divide方法时,传入了值为0的参数,导致divide方法在运算时出现被0除的异常(My Math1类第4行)。
异常产生后,如果自己能处理,那么异常处理后继续运行;如果自己没有针对该异常的处理方式,则只有交给调用者处理;如果main方法仍没有处理,则会交给调用者JVM,JVM有一个默认的异常处理机制,即调用异常对象的printStack Trace方法,该方法打印异常信息和异常出现的位置,同时JVM停止程序运行,异常产生后的剩余语句不再执行。
在Java中,通过不同的异常类来描述各种异常情况,当异常产生时,就会产生一个从对应异常类创建出来的对象,可见,异常在程序中就是一个异常类的对象。在本例中,异常类就是java.lang.ArithmeticException,产生的异常就是该类的一个对象。
在Java中,所有的异常都有一个共同的祖先java.lang.Throwable类,而Throwable类直接继承自基类java.lang.Object。Throwable类有两个直接子类Error和Exception,它们各自含有大量的子类。
Java异常类层次结构图如图5-3所示。(www.xing528.com)
图5-3 Java异常类层次结构图
1.Error类
java.lang.Error类描述的是程序本身无法处理的错误,是系统内部产生的错误。例如抽象类java.lang.Virtual MachineError的子类java.lang.Out Of MemoryError,因为内存溢出或没有可用的内存提供给垃圾回收器时,Java虚拟机无法分配一个对象,这时抛出该异常。合理的Java应用程序不应该试图捕获并处理Error类异常。对于Error类异常,一般都需要交给系统处理。
2.Exception类
java.lang.Exception类是程序本身可以处理的错误,是系统外部错误。Exception异常又分为运行时异常与编译异常。
1)运行时异常
运行时异常是指RuntimeException类及其子类。这类异常不会被编译器检测出来,即编译器不要求程序必须进行异常捕获处理或者抛出声明,由程序员自行决定。程序应该从逻辑角度尽可能避免运行时异常的发生,如果没有避免,由系统缺省的异常处理程序处理。例5-1中产生的Arithmetic Exception异常,就是一个运行时异常。
2)编译异常
编译异常是指Exception中除RuntimeException以外的异常。编译异常意味着编译器会在编译时强制检查程序员是否捕获处理该类异常或者声明抛出,如果程序没这么做,编译都不会通过。
例如,java.io.IOException异常,操作输入/输出时可能出现的异常,是失败或中断的I/O操作生成的异常的通用类。其中:子类java.io.EOFException表示文件已结束异常,当输入过程中意外到达文件或流的末尾时,抛出此异常;子类java.io.FileNot Found Exception表示文件未找到异常,当试图打开指定路径名表示的文件失败时,抛出此异常,等等。
再比如java.lang.Class Not Found Exception异常,当使用类时,没有找到具有指定名称的类的定义时会生成该异常。
请注意unchecked exception(非检查异常)和checked exception(检查异常)的概念。unchecked exception包括运行时异常和Error异常,而checked exception就是编译异常。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。