文档介绍:本章介绍Java程序的错误和异常处理机制。
理解致命性错误Error和异常Exception的基本概念及可能 发生错误或异常的情况。
了解异常类Throwable及其子类所处理的异常种类。
深入理解抛出异常和捕捉异常的概念。
掌握在程序中使用try-catch-finally语句结构处理异常的方
法。
掌握自定义异常的方法和主动抛出异常的方法。
本章学习目标
错误与异常的概念
程序运行时难免出现一些非正常的现象,例如死循环、除数为0、文件不存在、内存溢出等等。这些非正常的现象分为错误Error和异常Exception两种。
Error指的是致命性的错误,诸如死循环、递归无法结束、内存溢出、硬件设备错误(例如软驱损坏、打印机缺纸等)。这一类的错误只能在编程阶段解决,在程序运行时程序自身是无法自行处理的。
错误与异常的概念
Exception又可译为例外,指那些可以在编程时预测并可在程序运行时处理的错误。例如当两个变量做除法运算时,可以预测作为除数的变量也可能其值为0,这样在程序中就可以事先安排一段程序对这种异常的情况进行处理。
虽然异常是非致命性的错误,但是如果程序不加以处理,就默认由Java虚拟机处理,Java虚拟机在输出一个异常信息后也会造成程序的非正常结束。所以编程时必须对可预料的异常进行处理。有些异常可以通过编译,其异常只在程序运行到造成异常的语句时发生,例如“除数为0”的异常就是这样。也有的异常如果不加以处理就无法通过编译,例如在线程的run方法中就必须对InterruptedException异常进行编程处理,否则无法通过编译。
异常类
Throwable类
在Java中,一切异常都是用异常类Throwable的直接或间接派生的某个异常类的实例来处理的。
Throwable类有两个子类,为Error和Exception。Error类的子类都有后缀Error,这些类处理的都是系统内部错误,这类错误是不可修复和处理的,只能被动地通知用户发生了何种错误。Exception类的子类分为两种,即属于RuntimeException类的子类和不属于RuntimeException类的子类,其中RuntimeException类子类的异常基本上都是由于编程时不严谨的逻辑错误造成的,例如要求用户输入数字时没有充分考虑到用户有可能输入非数字的字符、汉字等。编程时要充分估计到此类错误发生的可能性,并在程序中加以处理。
异常类
Throwable类及其子类的关系示于图8-1中,而其中Exception类的子类更详细地列于表8-3中。
图8-1 Throwable类及其子类
异常类
表8-1中列出了Throwable类的常用方法,由于所有的异常类都是从Throwable类继承而来的,所以所有的异常类,不论是Java提供的异常类还是自定义的异常类,都支持这些方法。
表8-1 Throwable类的常用方法
常用方法
解释
public String getMessage()
返回一个与异常有关的字符串信息
public void printStackTrace()
打印显示异常抛出时的堆栈跟踪状态,并输出到标准的错误流中
public String toString()
返回一个简短描述异常对象的字符串信息
异常类
常用的异常类
要进行异常处理编程,就要了解常用的异常类,表8-2给出了Exception类的常用构造方法,表8-3给出了Exception类中的常用子类。
表8-2 Exception类的构造方法
构造方法
解释
public Exception()
创建一个新的异常类
public Exception(String message)
创建一个新的异常类并指定异常信息
异常类
表 8-3 异常类Exception的常用子类
异常类名
说明
AWTException
图形界面异常
ClassNotFoundException
未找到欲装载使用的类
InterruptedException
线程异常(例如睡眠、等待、被其他线程暂停)
IOException
输入、输出异常
FileNotFoundException
未找到指定的文件或目录
UnknownHostException
无法确定的主机IP地址
MalformedURLException
URL地址异常
NoSuchMethodException
未找到指定的方法
RuntimeException
运行时异常
异常类