5.1 概述

程序执行中发生的不正常情况。例如:空指针访问、试图读取不存在的文件、网络连接中断、数组越界、除数为0

  • 编译时异常(RuntimeException类及其子类异常):是指编译器要求必须处理的异常。
  • 运行时异常:一般指编程时的逻辑错误。可以不处理,因为全部处理会影响程序可读性和效率。
  • 错误: 错误不是异常。

    5.2 异常处理机制—try-catch-finally

在编写程序时,要在可能出现错误的地方加上检测代码,如分母为0,数据为空等。

Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。异常类对象由虚拟机自动生成,也可以由开发人员手动创建。

  1. // 异常类和普通对象一样,可访问其成员变量和方法
  2. getMessage(); 获取异常信息,返回字符串
  3. printStackTrace(); 获取异常类名和异常信息,以及异常出现在程序中的位置

如果一个方法抛出异常,该异常对象会被抛给调用者处理。如果异常没有在调用者中处理,它继续被抛给这个调用方法的上层方法,直到异常被处理。这一过程称为捕获(catch)异常。如果异常回到main()并且main()也不处理,则程序运行终止。

  1. // 对不同类别异常进行区分处理
  2. try{
  3. // 可能产生异常的程序代码
  4. }catch(异常类型1 异常的变量名1){
  5. // 异常类型1的处理程序代码
  6. }catch(异常类型2 异常的变量名2){
  7. // 异常类型2的处理程序代码
  8. }
  9. finally{
  10. // 无论是否发生异常均执行,通常省略
  11. }

5.3 异常处理机制—throws/throw

如果语句执行时可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

  1. public void readFile(String file) throws FileNotFoundException {
  2. ……
  3. // 读文件的操作可能产生FileNotFoundException类型的异常
  4. FileInputStream fis = new FileInputStream(file);
  5. ……
  6. }

Java异常类对象除在程序执行过程中由系统自动生成并抛出,也可根据需要人工创建并抛出。

  1. // 抛出的异常必须是Throwable或其子类的实例
  2. IOException e = new IOException();
  3. throw e;

5.4 自定义异常类

自定义检查性异常类需要继承 Exception 类;运行时异常类需要继承RuntimeException 类;一个异常类和其它任何类一样,包含有变量和方法。一般的用户自定义异常类都是RuntimeException的子类。

  1. // 用于描述数据取值范围错误信息。
  2. class MyException extends Exception {
  3. static final long serialVersionUID = 13465653435L; // 序列ID
  4. private int idnumber;
  5. public MyException(String message, int id) {
  6. super(message);
  7. this.idnumber = id;
  8. }
  9. public int getId() {
  10. return idnumber;
  11. }
  12. }