第十一章 异常处理
主要知识点
1、异常产生的原因
2、标准异常类
3、Java的异常处理机制
4、异常的创建
5、异常的抛出
6、异常语句的编程
学习目标
熟悉异常产生的原因和标准异常类的用法。能够运用异常处理机制编写Java程序,提高安全性;
11.1 异常的分类
一旦出现异常,系统将会立刻中止程序的运行,并将控制权返回给操作系统,而此前分配的所有资源将继续保持原有状态,导致资源浪费。
11.1.1 异常的产生
程序员在编写程序时,难免会出现一些问题,导致程序运行时出现一些非正常的现象,例如,死循环、非正常退出等。称为运行错误,根据错误性质分为两类:
(1)致命性错误(Error):简称为错误,如程序进入死循环,递归无法结束等,错误只能在编译阶段解决,进行时程序本身无法解决;
(2)非致命性错误(Exception):如运算时除数为0,打开一个不存在的文件等。这类现象称为异常。
1、异常产生的原因:
(1)JVM检测到非正常的执行状态,这些状态可能由以下情况引起:
(1)表达式违反了Java语言的语义,如除数为0;
(2)装入或链接程序时出错;
(3)超出资源限制,如内存不足,这种异常是程序员无法预知的。
(2)程序代码中的throws语句被执行。
(3)因为代码段不同步而产生的,可能的原因是:
(1)Thread(线程)的stop方法被调用;
(2)JVM内部发生错误。
2、异常的层次结构:
Java程序的异常按照类的层次结构组织,所有异常类的父类是Throwable,它是Object类的直接子类,分为Error和Exception两个直接子类。而RuntimeException类是Exception类的直接子类。其中,Error类用来显示与系统本身有关的错误,其对象是由Java虚拟机生成并抛出;而Exception类是用来显示用户程序可能捕获的异常,也是用来创建用户异常类型子类的类,其对象由应用程序处理或抛出。
11.1.2 Java定义的标准异常类
这些标准异常类分为两种:RuntimeException和Exception,前者是运行时异常,属于不可检测的异常类,后者是可检测的异常类。Java定义的标准异常类见下图所示:
11.2 异常处理机制
程序运行时如果发生异常,立即自动终止运行并输出提示信息,异常处理就是对所发生的异常进行处理,从而避免出现死机或者重启机器的现象。Java语言提供的异常处理机制,有助于找出异常类型并恢复它们。Java对于异常处理由两种:
(1)通过try-catch语句处理异常,把可能发生异常的语句放在try语句中,catch捕获异常并处理。
(2)把异常抛给上一层调用它的方法,由该方法进行异常处理或继续抛给上一层。
11.2.1 异常处理的语句结构
Java语句提供的异常处理机制是:try-catch-finally语句块进行异常的监视、捕获和处理,也可以通过throws语句抛出异常。含有异常处理机制程序的一般结构是:
try{ ......} // 这里写被监视的代码段,一旦发生异常,则由catch代码处理 catch(异常类型 e){ ......} // 待处理的第一种异常 catch(异常类型 e){ ......} // 待处理的第二种异常 ...... finally{......} // 最终处理的代码段
11.2.2 Throwable类的常用方法
Throwable是java.lang包中一个专门用来处理异常的类,Throwable类的方法均可以被其子类调用,用于显示异常类型、原因等信息。Throwable类的常用方法如下所示:
(1)getCause():如果异常为空或者不存在或者不明,用它返回
(2)getLocalizedMessage():返回本地化信息
(3)getMessage():返回异常的原因
(4)getStackTrace():返回堆栈跟踪信息
(5)printStackTrace():打印堆栈的标准错误流
(6)printStackTrace():打印堆栈的标准打印流
(7)toString():// 返回简单描述;
对于程序运行时出现了没有声明的异常,程序本身无法捕获这种异常,系统采用的方法是:依次向上递交,由上一级处理,上一级处理不了,在向更上一级,直到最后操作系统为止。
11.2.3 异常类的创建
用户也可以创建自己的异常类,这种异常类一定是Exception或者Throwable的子类,因此,可以用建立类的语句来创建异常类,但需要集成某一个异常类。例如:
class 异常名 extends Exception{......}
用户一旦定义了自己的异常类,在程序中就可以像标准的异常类一样使用。需要为自定义异常类设计构造方法,以便方便构造自定义异常对象。
11.3 异常的抛出
所谓抛出异常,指的是在程序运行时如果出现异常,则执行相应的程序代码段,而不必让整个程序中止。因此需要有一段Java代码生成一个异常对象并把它抛弃。都可以通过throw语句或者是throws语句来实现抛出的。
11.3.1 throw语句
throw语句的格式为:
throw ThrowableObject;
其中ThrowableObject必须是Throwable类或其子类的对象。
11.3.2 throws语句
throws语句用来表明一个方法可能抛出的所有异常,对于大多数Exception子类和自定义异常类来说,Java编译器会强迫程序员在方法的声明语句中表明抛出的异常类型。以便于通知调用这个方法的其他方法准备捕获此异常。
习题
一、简答题
1、什么是异常?异常产生的原因有哪些?
2、为什么Java的异常处理技术优于传统程序的异常处理技术?
3、在Java代码中可用来处理异常的方式有哪些?
4、如果发生了一个异常,但是没有找到适当的异常处理程序,则会发生什么情况?
5、说明throw语句与throws语句有什么不同?
6、在设计catch块处理不同的异常时,一般应注意哪些问题?
二、操作题
1、编写一个程序,用来将作为命令行参数输入的值转换为数字,如果输入的值无法转换为数字,则程序应显示相应的错误信息,要求通过异常处理方法解决。
2、编写一个程序,用于将来自用户的两个数字接收为命令行参数。将第一个数字除以第二个数字并显示结果。代码应当处理引发的异常,即在输入的参数数量不足两个或用户输入0作为参数时引发异常。
3、编写一个程序,说明在一个catch处理程序中引发一个异常时会发生什么情况。
4、编写一个可演示用户自定义异常用法的程序,该程序接受用户输入的学生人数,当输入一个负数时,认为是非法的,用户自定义异常捕获此错误。
4、