Java中的异常类(非常详细)
Java 中所有的异常类都是从 Throwable 类继承而来的,它们的层次结构如下图所示:

图 1 异常类的层次结构图
Throwable 类有两个直接的子类,一个是 Exception 类,另一个是 Error 类。
Exception 类是应该被程序捕获的异常。如果要创建自定义异常类型,则这个自定义异常类型也应该是 Exception 的子类。
Exception 类下面又有两个分支,分别是运行时异常和非运行时异常:
Error 类及其子类通常用来描述 Java 运行时系统的内部错误以及资源耗尽的错误,例如系统崩溃、动态链接失败、虚拟机错误等。这类错误一般被认为是无法恢复和不可捕获的,程序不需要处理这种异常,出现这种异常的时候应用程序中断执行。
Java 编译器要求 Java 程序必须捕获或声明所有的非运行时异常,如 FileNotFoundException、IOException 等。因为如果不对这类异常进行处理,可能会带来意想不到的后果。因此 Java 编译器要求程序必须捕获或者声明这种异常。
对于运行时异常,Java 程序可以不做处理,因为这类异常事件的生成是很普遍的,要求程序对这类异常全部做出处理可能对程序的可读性和高效性带来不好的影响,因此 Java 编译器允许程序不对它们做出处理。
下面简要介绍几个常见的运行时异常。
其中,ArrayIndexOutOfBoundsException 举例如下:

图 1 异常类的层次结构图
Throwable 类有两个直接的子类,一个是 Exception 类,另一个是 Error 类。
Exception 类是应该被程序捕获的异常。如果要创建自定义异常类型,则这个自定义异常类型也应该是 Exception 的子类。
Exception 类下面又有两个分支,分别是运行时异常和非运行时异常:
- 运行时异常是运行时由 Java 虚拟机生成的异常,指 Java 程序在运行时发现的由 Java 解释器引发的各种异常,例如数组下标越界异常 ArrayIndexOutOfBoundsException、算数运算异常 ArithmeticException等;
- 其他异常则为非运行时异常,指能由编译器在编译时检测是否会发生在方法执行过程中的异常,例如 I/O 异常 IOException 等。java.lang、java.util、java.io 和 java.net 包中定义的异常类都是非运行时异常。
Error 类及其子类通常用来描述 Java 运行时系统的内部错误以及资源耗尽的错误,例如系统崩溃、动态链接失败、虚拟机错误等。这类错误一般被认为是无法恢复和不可捕获的,程序不需要处理这种异常,出现这种异常的时候应用程序中断执行。
Java 编译器要求 Java 程序必须捕获或声明所有的非运行时异常,如 FileNotFoundException、IOException 等。因为如果不对这类异常进行处理,可能会带来意想不到的后果。因此 Java 编译器要求程序必须捕获或者声明这种异常。
对于运行时异常,Java 程序可以不做处理,因为这类异常事件的生成是很普遍的,要求程序对这类异常全部做出处理可能对程序的可读性和高效性带来不好的影响,因此 Java 编译器允许程序不对它们做出处理。
Java常见异常类
常见的异常类如下表所示:异常类名称 | 异常原因 |
---|---|
ArithmeticException | 算数异常,如被零除发生的异常 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
ArrayStoreException | 程序试图在数组中存储错误类型的数据 |
ClassCastException | 类型强制转换异常 |
IndexOutOfBoundsException | 当某对象的索引超出范围时抛出异常 |
NegativeArraySizeException | 建立元素个数为负数的数组异常 |
NullPointerException | 空指针异常 |
NumberFormatException | 字符串转换为数字异常 |
StringIndexOutOfBoundsException | 程序试图访问字符串中不存在的字符位置 |
OutOfMemoryException | 分配给新对象的内存太少 |
SocketException | 不能正常完成Socket操作 |
ProtocolException | 网络协议有错误 |
ClassNotFoundException | 未找到相应异常 |
EOFException | 文件结束异常 |
FileNotFoundException | 文件未找到异常 |
IllegalAccessException | 访问某类被拒绝时抛出的异常 |
InstantiationException | 试图通过newInstance()方法创建一个抽象类或抽象接口的实例时抛出该异常 |
IOException | 输入输出异常 |
NoSuchMethodException | 方法未找到异常 |
SQLException | 操作数据库异常 |
下面简要介绍几个常见的运行时异常。
1) ArithmeticException类
该类用来描述算数异常。例如,在除法或求余运算中规定,除数不能为 0,所以当除数为 0时,Java 虚拟机抛出该异常。例如:int div=5/0; //除数为 0,抛出ArithmeticException异常
2) NullPointerException类
该类用来描述空指针异常。当引用变量值为 null 时,试图通过“.”操作符对其进行访问,将抛出该异常,例如:int div=5/0; //除数为0,抛出ArithmeticException异常 Date now=null; // 声明一个Date型变量,但没有引用任何对象 String today=now.toString(); // 抛出NullPointerException异常
3) NumberFormatException类
该类用来描述字符串转换为数字时的异常。当字符串不是数字格式时,若将其转换为数字,则抛出该异常。例如:String strage="241"; int age=Integer.parseInt(strage); // 抛出NumberFormatException
4) IndexOutOfBoundsException类
该类用来描述某对象的索引超出范围时的异常,其中 ArrayIndexOutOfBoundsException 类与 StringIndexOutOfBoundsException 类都继承自该类,分别用来描述数组下标越界异常和字符串索引超出范围异常。其中,ArrayIndexOutOfBoundsException 举例如下:
int[] d=new int[3]; // 定义数组,有三个元素 d[0]、d[1]、d[2] d[3]=10; // 对 d[3] 元素赋值,会抛出ArrayIndexOutOfBoundsException 异常
5) ClassCastException类
该类用来描述强制类型转换时的异常。例如,强制转换 String 型为 Integer 型时,将抛出该异常。Object obj=new String("887"); // 引用型变量obj引用String型对象 Integer s=(Integer)obj; // 抛出ClassCastException异常