捕捉异常
语法如下:
try{
//程序代码块
}
catch(Exception1 e){
//对 Exception1 的处理
}
catch(Exception2 e){
//对 Exception2 的处理
}
...
[finally{
//程序块
}]
通常,异常处理常用一下3个函数来获取异常的有关信息。
- getMessage()函数:输出错误性质。
- toString()函数:给出异常的类型与性质。
- printStacktrace()函数:指出异常的类型、性质、栈层次及出现在程序中的位置。
final 语句块
完整的异常处理语句一定要包含 finally 语句,无论程序中有无异常发生,并且无论之间的 try-catch是否顺利执行完毕,都会执行 finally 语句。
在以下 4 种特殊情况下,finally 块不会被执行:
- 在 finally 语句块中发生了异常。
- 在前面的代码中使用了 System.exit() 退出程序。
- 程序所在的线程死亡。
- 关闭 CPU。
常见异常
异常类 | 说明 |
---|---|
ClassCastException | 类型转换异常 |
ClassNotFoundException | 未找到相应类异常 |
ArithmeticException | 算术异常 |
ArrayIndexOutBoundsException | 数组下标越界异常 |
ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
SQLException | 操作数据库异常 |
NullPointerException | 空指针异常 |
NoSuchFieldException | 字段未找到异常 |
NoSuchMethodException | 方法找到抛出的异常 |
NumberFormatException | 字符串转换为数字抛出的异常 |
NegativeArraySizeException | 数组元素个数为负数抛出的异常 |
IOException | 输入输出异常 |
IllegalAccessExption | 不允许访问某类异常 |
InstantiationException | 当应用程序试图使用 Class 类中的 newinstance() 方法船舰一个类的实例,而指定的类对象无法被实例化,抛出该异常 |
EOFException | 文件已结束异常 |
FileNotFoundException | 文件未找到异常 |
自定义异常
使用 Java 内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需要继承 Exception 类即可自定义异常类。
在程序中使用自定义异常类,大体可分为以下几个步骤:
(1)创建自定义异常类,super(ErrorMessage)调用父类构造方法。
(2)在方法中通过 throw 关键字抛出异常。
(3)如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句块捕获并处理,否则在方法的声明处通过 throws 关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)再出现异常方法的调用者中捕获并处理异常。
在方法中抛出异常
throws 关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以用逗号隔开。
如果是 Error、RuntimeException 或他们的子类,可以不使用 throws 关键字来声明要抛出的异常,编译仍然能顺利通过,但运行时会被系统抛出。
运行时异常
RuntimeException 异常是程序运行过程中产生的异常。Java 类库的每个包都定义了异常类,所有这些类都是 Throable 类的子类。Throwable 类派生了两个子类,分别是 Exception 和 Error 类。Error 类及其子类用来描述 Java 运行系统中内部错误以及资源耗尽的错误,这类错误比较严重。Exception 类称为非致命类,可以通过捕捉处理使程序继续执行。Exception 类又根据错误发生的原因分为 RuntimeException 异常和除 RuntimeException 之外的异常。
异常的使用原则
Java 异常强制用户去考虑程序的健壮性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:
- 在当前方法声明中使用 try-catch 语句捕获异常。
- 一个方法被覆盖时,覆盖他的方法必须抛出相同的异常或异常的子类。
- 如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新的异常。