一、什么是异常
异常就是程序运行的工程中出现了错误
二、Java异常体系
从上图可以看出:Throwable有两个直接子类 Eror和 Exception,其中Emor代表程序中产生的错误,Exception代表程序中产生的异常。
1. Eror和 Exceplion 继承自Throwable类
(1)Throwable类:
Throwable类中的常用方法
方法声明 | 功能描述 |
String getMessage() | 返回异常的消息字符串 |
String toString ( ) | 返回异常的简单信息描述 |
void printStackTrace ( ) | 获取异常类名和异常信息,以及异常出现在程序中的位置,把信息输出在控制台 |
这些方法都用于获取异常信息。因为 Eror和 Exceplion 继承自Throwable类所以它们都拥有这些方法,在后面的异常学习中会逐渐接触到这些方法的使用。
(2) Emtor 类:
Emtor 类称为错误类,它表示 Java 程序运行时产生的系统内部错误或资源耗尽的错误,这类错误比授严重,仅靠修改程序本身是不能恢复执行的。
(3)Exception 类:
Exception 类称为异常类,它表示程序本身可以处理的错误,在Java 程序中进行的异常处理,都是对 Exoeption 类及其子类的。在 Exception 类的众多子类中有一个特殊的子类-RuntimeException类RuntimeException 类及其子类用于表示运行时异常。Exception 类的其他子类都用于表示编译时异常。
异常处理
捕获异常
(1)try...catch
异常捕获使用ty...catch 语句实现,ty..catch 具体语法格式如下:
try{
//可能出现异常的代码
}catch (ExceptionType (Exception 类及其子类) e){
//对ExceptionType 的处理(异常处理代码)
}
若在try...catch 中执行了 Systemexit(0)语句 (退出当前的Java 虚拟机),任何代码都不再执行
上述语法格式中,在ty代码块中编写可能发生异常的Java 语句,在 atch 代码块中编写针对异常进行处理的代码。当ty 代码块中的程序发生了异常,系统会将异常的信息封装成一个异常对象,并将这个对象传递给 catch 代码块进行处理。catch 代码块需要一个参数指明它所能接收的异常类型,这个参数的类型必须是Exception 类或其子类。
(2) 捕获多个异常
try{
//可能出现异常的代码
}catch (异常类型1 异常变量名1){
//异常处理代码1
}catch (异常类型2 异常变量名3){
//异常处理代码2
}catch (异常类型3 异常变量名3){
//异常处理代码3
}
1. 当某个程序块出现多个异常时,可以用多个catch,每个catch捕捉-种异常,捕捉异常的顺序和catch语句的顺序有关,当捕捉到一个异常时,其他catch语句就不再进行匹配了。
2.catch可以写多个,子类异常在前父类异常在后
(3) finally
在程序中,有时候会希望有些语句无论程序是否发生异常都要执行,这时就可以在 try...catch 语句后加个finally代码块。
try{
//可能出现异常的代码
}catch (异常类型1 异常变量名1){
//异常处理代码1
}catch (异常类型2 异常变量名3){
//异常处理代码2
}catch (异常类型3 异常变量名3){
//异常处理代码3
}finally{
//最后要执行的代码
}
1. finally不能单独使用,必须和try-起使用。
2.try块是否引发异常,finally块中的代码始终都会执行(除了调用System.exit(0) 退出JVM)。 如果try中有return,会先执行finally再return.
3. finally一般用于资源释放( 资源回收),无论程序是否出现异常,最后都需要资源释放(IO )
抛出异常
1.throw关键字
用于方法体中,抛出一个异常对象。一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常
2. throws关键字
用于方法头,声明该方法会抛出异常。一个方法可以声明抛出多个异常,多个异常之间用逗号隔开
修饰符 返回值类型 方法名(参数 1,参数 2....)throws 异常类 1.异常类 2....{
//方法体...
编译时异常与运行时异常
1.编译时异常
在Excepton类中除了RuntmeException类及其子类外,Exception的其他子类都是编译时异常。编异常的特点是Java 编译器会对异常进行检查,如果出现异常就必须对异常进行处理,否则程序无法通过编译
有两种方式处理编译时期的异常、具体如下
(1)使用tv...catch语句对异常进行捕获处理
(2)使用throws关键字声明抛出异常,调用者对异常进行处理
2.运行时异常
RuntimeException类及其子类都是运行时异常。
运行时异常的特点是Java编译器不会对异常进行检查也就是说,当程序中出现这类异常时,即使没有使用ty.catch语句捕获或使用throws 关键字声明抛出序也能编译通过。运行时异常一般是由程序中的逻辑错误引起的,在程序运行时无法恢复。
自定义异常
自定义的异常类必须继承自 Exception 或其子类。自定义异常类中使用throw 关键字在方法中声明异常的实例对象,格式如下:
throw Exception 异常对象