一、异常的理解
1. 异常:程序运行过程中出现的非正常情况
2. 异常的分类:
(1)父类:Throwable,位于java.lang包中
(2)子类:Error,错误
(3)子类:Exception,异常
二、异常的分类
1. 父类:Throwable,位于java.lang包中
(1)Throwable类是Java语言中所有错误或异常的超类(父类)
(2)常见构造方法:
Throwable():无参数的构造方法
Throwable(String message) :带有字符串类型的构造方法,参数异常的信息
(3)成员方法:
viod printStackTrace():打印异样详细信息,用于程序开发调式
String getMessage() :获取字符串类型的异常信息
2. 子类:Error,代表错误
(1)Error是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题(白哦是仅靠程序无法恢复的严重错误)
(2)案例:内存空间不足,或是Java虚拟机方法调用是栈溢出。(java.lang.StackOverflowError)
(3)特点:遇到这样的错误,程序中无法处理。
3. 子类:Exception,代表异常
(1)运行时异常:java.lang.RuntimeException的子类或是间接的子类
a. 特点:编译器不会检测它,运行时报错
b. 案例:
java.lang.ArrayIndexOutOfBoundsException(数组的下标越界)
java.lang.StringIndexOutOfBoundsException(字符串下标越界)
java.lang.IndexOutOfBoundsEception(下标越界)
java.lang.NullPointerException(空指针异常)
java.lang.NumberFormatException(数字格式转换异常)
java.lang.ClassCastException(类型转换异常)
c. 处理:这种异常可以避免,可以处理也可以不处理
(2)非运行时异常:和java.lang.RuntimeException 没有任何继承关系的异常类
a. 特点:编译过程中编译器进行检测,编译报错
b. 案例:
class.forName("hello");
c. 处理:非运行时异常一旦出现必须处理,否则编译无法通过
d. 编译报错:
i. 语法问题
ii. 非运行时异常,必须通过异常的处理手段进行解决
三、异常的产生
1. 自动产生异常:运行程序时,遇到错误的代码,自动产生异常,程序自动终止
结果:程序因为异常而被终止
2. 手动产生异常:
(1)关键字:throw
(2)语法:throw new 异常类名(“异常信息”);
(3)位置:必须动议方法的内部
(4)结果:程序因异常而被终止
四、异常传递
异常传递:按着方法的调用链方向反向传递,直至JVM,最终导致程序终止
五、异常的处理
1. 消极处理异常
(1)关键字:throws
(2)位置:定义方法的声明部分
(3)语法:
修饰符:返回值类型 方法名(形参)throws 异常类名1,异常类名2{}
(4)结果:程序依然因为异常而被终止,没有从根本上解决问题,只是推卸责任
(5)作用:可以让非运行时异常编译通过
2. 积极处理异常
(1)语法:
try{
// 可能出现异常的语句
}catch(异常类名 e){
// 出现异常时,需要执行的语句
}
(2)位置:定义在方法实现内
(3)try后面跟多个catch结构,仓上往下依次进行匹配
(4)利用多态的技术,使用父类型处理子类型的异常;而且子类型在前,父类型在后
(5)finally:定义在try..catch后面,finally中的语句,不管有没有异常必须执行的语句
a. 语法
try{
// 可能出现异常的语句
}catch(异常类名 e){
// 出现异常时,需要执行的语句
}finally{
// 不管有没有异常,都需要执行的语句
}
六、自定义异常类
1.定义一个类继承异常类
(1)定义一个异常类继承了 Exception,定义的为非运行时异常
(2)定义异常类继承了 RuntimeException,则定义的为运行时异常
2. 提供两个构造方法
(1)无参数的构造方法
(2)带有字符串类型的参数构造方法
public 类名(String message){
super(message);
}
七、方法覆盖[终极版]
1. 子类的方法名、形参列表、返回值类型和父类相同
2. 子类的访问修饰符和夫类型或是比夫类型更宽
3. 子类不能抛出比父类更宽的异常