5.1 概述
程序执行中发生的不正常情况。例如:空指针访问、试图读取不存在的文件、网络连接中断、数组越界、除数为0
- 编译时异常
(RuntimeException类及其子类异常)
:是指编译器要求必须处理的异常。 - 运行时异常:一般指编程时的逻辑错误。可以不处理,因为全部处理会影响程序可读性和效率。
- 错误: 错误不是异常。
5.2 异常处理机制—try-catch-finally
在编写程序时,要在可能出现错误的地方加上检测代码,如分母为0,数据为空等。
Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。异常类对象由虚拟机自动生成,也可以由开发人员手动创建。
// 异常类和普通对象一样,可访问其成员变量和方法
getMessage(); 获取异常信息,返回字符串
printStackTrace(); 获取异常类名和异常信息,以及异常出现在程序中的位置
如果一个方法抛出异常,该异常对象会被抛给调用者处理。如果异常没有在调用者中处理,它继续被抛给这个调用方法的上层方法,直到异常被处理。这一过程称为捕获(catch)异常。如果异常回到main()并且main()也不处理,则程序运行终止。
// 对不同类别异常进行区分处理
try{
// 可能产生异常的程序代码
}catch(异常类型1 异常的变量名1){
// 异常类型1的处理程序代码
}catch(异常类型2 异常的变量名2){
// 异常类型2的处理程序代码
}
finally{
// 无论是否发生异常均执行,通常省略
}
5.3 异常处理机制—throws/throw
如果语句执行时可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
public void readFile(String file) throws FileNotFoundException {
……
// 读文件的操作可能产生FileNotFoundException类型的异常
FileInputStream fis = new FileInputStream(file);
……
}
Java异常类对象除在程序执行过程中由系统自动生成并抛出,也可根据需要人工创建并抛出。
// 抛出的异常必须是Throwable或其子类的实例
IOException e = new IOException();
throw e;
5.4 自定义异常类
自定义检查性异常类需要继承 Exception 类;运行时异常类需要继承RuntimeException 类;一个异常类和其它任何类一样,包含有变量和方法。一般的用户自定义异常类都是RuntimeException的子类。
// 用于描述数据取值范围错误信息。
class MyException extends Exception {
static final long serialVersionUID = 13465653435L; // 序列ID
private int idnumber;
public MyException(String message, int id) {
super(message);
this.idnumber = id;
}
public int getId() {
return idnumber;
}
}