首页 > 编程笔记 > Java笔记 阅读:34

Java中的异常类(非常详细)

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


图 1 异常类的层次结构图

Throwable 类有两个直接的子类,一个是 Exception 类,另一个是 Error 类。

Exception 类是应该被程序捕获的异常。如果要创建自定义异常类型,则这个自定义异常类型也应该是 Exception 的子类。

Exception 类下面又有两个分支,分别是运行时异常和非运行时异常:
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异常

相关文章