异常
什么是异常?
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序.
程序运行–>异常(程序中断) STOP
在Java中,Java编程语言使用异常处理机制为程序提供了错误的能力
步骤:
1.程序中预先设置好对付异常的处理方法
2.程序运行
3.异常
4.对异常进行处理
5.处理完毕,程序继续运行
try-catch块
情况一:正常状况 使用try-catch块捕获异常
public void method(){
try{
//代码块(此处不会产生异常)
}catch(异常类型ex){
//对异常进行处理的代码块
}
//代码块
}
情况二:出现异常
情况三:pritnStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行
情况四:异常类型不匹配
情况五:
在catch块中处理异常
-加入用户自定义处理信息
system.out.print("出现错误:被除数和除数必须是整数");
-调用方法输出异常信息
e.printStackTrace();
-异常对象常用的方法
方法 | 说明 |
---|---|
void printStackTrace() | 输出异常的堆栈信息 |
String getMessage() | 返回异常信息描述字符串,是printStackTrace()输出信息的一部分 |
常见的异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
try-catch-finally
在try-catch块后加入finally块
1.是否发生异常都执行
2.不执行的唯一情况
存在return的try-catch-finally块
多重catch块
引发多种类型的异常
1.排列catch语句的顺序:先子类后父类
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的catch语句
声明异常
如果在一个方法体中抛出了异常,如何通知调用者?
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式一:调用者处理异常
方式二:调用者继续声明异常:mian()方法声明的异常由Java虚拟机处理
抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
使用throe抛出异常
throw与throws
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出了异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
异常结构体系
自定义异常
当JDK中的异常类型不能满足程序的需要时,可以自定义异常类
使用自定义异常的步骤
1.定义异常类(继承Throwable类、继承Xepection或者RuntimeException)
2.编写构造方法,继承父类的实现
3.实例化自定义异常对象
4.使用throw抛出
异常链
A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新的异常?
1.抛出原有的异常:A方法与B方法进行了关联,不便于代码的修改和扩展
2.抛出新的异常:异常链创建了新的异常但却保留了原有异常的信息
异常处理原则
1.异常处理与性能(异常只去捕获有可能出现异常的地方)
2.异常只能处理非正常情况
3.不要将过于庞大的代码块放在try中在catch中指定具体的异常类型
4.需要对捕获的异常做处理
总结
1.try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一;
2.try-catch-finally块中,finally块唯一不执行的情况是什么?
答:System.exit(1); ps.此时这个数字不能为0
3.异常分为Checked异常和运行时异常
答:Checked一场必须捕获或者声明抛出
运行时异常不要求必须捕获或者声明抛出
面试题
1.try-catch块中存在return语句,是否还执行finally块?如果执行,说出执行顺序。
答:先执行finally块,再执行return
案例
案例1
创建一个Person类
private int age;
对以上进行getter/setter
创建一个类
new一个Person
—Person p = new Person();
set这个Person的年龄
—p.setAge(15);
y块?如果执行,说出执行顺序。
答:先执行finally块,再执行return