5.异常
异常的继承体系:
异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类:
java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。
Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。
Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。
运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)
Object
|-- Throwable
|-- Error 错误
|-- Exception 编译异常,受检异常
|-- RuntimeException 运行异常,非受检异常
Throwable中的常用方法:
public void printStackTrace() :打印异常的详细信息。
包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
public String getMessage() :获取发生异常的原因。
提示给用户的时候,就提示错误原因。
public String toString() :获取异常的类型和异常描述信息(不用)。
jvm虚拟机处理异常的方式
Throw与throws的区别:
- throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。
- throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常对象抛给方法调用处。
throw关键字:
代表主动抛出一个异常,搞事情。
throw new 异常类(参数);
格式:
异常类 异常对象名 = new 异常类(参数); // 首先创建一个异常对象
throw 异常对象名; // 然后再抛出
throws关键字:
代表本方法当中出现了异常,我不管。甩锅。
修饰符 返回值类型 方法名(参数类型 参数名称) throws 异常A, 异常B {
方法体
}
注意事项: 1. throws后面可以写上多个异常类的名称,使用逗号分隔即可。 2. throws后面如果多个异常之间存在继承关系,那么只写父异常即可,但是
都写上也不算错。 3. 无论是编译异常还是运行异常,都可以写在throws的后面表示甩锅。但是运行异常一般不用写也可以。
java.util.Objects工具类
其中有可以进行非空检查的方法
选择try-catch还是throws的时候,评判标准:
如果我这个方法中产生了异常,我就不应该再继续执行方法了,应该中断,那么就要使用throws。【直接崩】 如果我这个方法中产生了异常,但是我还应该继续向后执行,那么就要使用try-catch。【还能继续】
异常处理try-catch语句:
try {
// 被检测的代码
} catch (异常类 异常对象名) {
// 处理异常的代码
}
代码执行流程: 如果try当中没有发生异常,那么catch语句不会执行。 如果try当中发生了异常,那么try当中剩下的语句就不会再执行 如果catch捕获成功,那么将会执行catch当中的代码。然后继续后面 如果catch捕获不成功,那么异常将会继续抛给上一级。
异常处理try-catch-finally语句:
try {
// 被检测的代码
} catch (异常类 异常对象名) {
// 处理异常的代码
} finally {
// 一定会被执行的语句
}
只有两个人可以阻止finally的运行:
1. System.exit(int)方法:直接和JVM打交道,上帝模式退出程序。
2. 电脑停电。
可以使用多个catch语句:
try {
} catch (A a) {
} catch (B b) {
}
要求:如果互相之间存在继承关系,必须保证子类异常在前面,父类异常在后面。
可以在一个catch当中捕获多种异常:
try {
} catch (A | B | C ex) {
}
要求:用竖线分隔的多种异常之间,不能存在继承关系。如果有继承,应该只写父类异常。
方法覆盖重写的时候,必须保证:
子类方法的throws异常范围,【小于等于】父类的范围。
Throwable当中的常用方法:
getMessage():获取细节信息。
toString():异常名称+细节信息。
printStackTrace():打印异常栈信息(异常发生的位置信息)。
自定义的异常
使用步骤:
1. 定义一个类,继承一个已经存在的异常。
2. 编写一个无参数的构造方法。
3. 编写一个String参数的构造方法,并且调用super(String);
编译异常:Exception及其子类,但是除了RuntimeException及其子类
1. 要么try-catch处理
2. 要么throws甩锅
写上有红线,不能不理会。
运行异常:RuntimeException及其子类
1. 可以try-catch处理
2. 也可以throws甩锅
3. 还可以根本不理会,没有红线
自定义异常举例:
常见异常,及产生原因
问题:请列举常见异常,并说明产生原因。
答:
NullPointerException:空指针异常。
当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。
ArrayIndexOutOfBoundsException:数组索引越界异常。
当对数组的索引值为负数或大于等于数组大小时抛出此异常。
ArithmeticException:算术运算异常。
程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
NumberFormatException:数字格式异常。
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。