@wangyupu
2020-06-11T14:49:02.000000Z
字数 2887
阅读 28
JAVA面向对象
了解异常概念
理解Java异常处理机制
会捕捉异常
会抛出异常
了 解Java异常体系结构
正常情况下,小王每日开车去,上班, 耗时大约30分钟
一路畅通
但是,异常情况迟早要发生!()
堵车!
撞车
1、代码廉肿
2、程序员要花很大精力“堵漏洞”
3、程序员很难堵住所有“漏洞”
使用异常处理机制
异常是指在程序的运行过程中所发生的不正常的事件它会中断正在运行的程序
程序运行 异常 程序中断运行
生活中面对异常通常会这样处理
堵车! 绕行或者等待
撞车! 请求交警解决
生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活
程序中预先设置好对付异常的处理办法------程序运行-----异常
对异常进行处理------------处理完毕,程序继续运行
Java的异常处理是通过5个关键字来实现的:
try.catch、finally. throw, throws
捕获异常 声明异常 抛出异常
try 执行可能产生异常的代码 throws throw
catch 捕获异常 声明方法可能要抛出的各种异常 手动抛出异常
finally 无论是否发生异常,代码总能执行
使用try-catch块捕获异常, 分为三种情况:
第一种情况:正常
public void method(}{
try {
//代码段(此处不会产生异常)
} catch (异常类型ex) {
//对异常进行处理的代码段
catch
}
//代码段
try-------------------catch块后的代码段
在catch块中处理异常
加入用户自定义处理信息
System.err.printn("出现错误:被除数和除数必须是整数");
调用方法输出异常信息
e.printStackTrace();
异常对象常用的方法
方法 | 说明 |
---|---|
void printStackTrace() | 输出异常的堆栈信息 |
String getMessage() | 返回异常信息描述字符串,是printStackTrace()输出信息的一部分 |
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abe"转换成数字 |
在try-catch块后加入finally块
是否发生异常都执行
不执行的唯一情况
try块
↓→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→↓
↓有异常 ↓
↓ ↓ 无异常
↓ ↓中断程序,退出Java虚拟机
↓ ↓
↓ ↓
catch块 ↓
System.exit(1) ↓
↓ ↓
↓ ↓
↓ ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↓
↓
finally块→→→→→→→→→→→→→→→→→→→→→→→→→→→→→不管添加
存在return的try-catch-finally块
public void method(){
try {
//代码段1
//产生异常的代码段2
}catch(异常类型ex){
//对异常进行处理的代码段3
return;
}finally{
//代码段4
}
try块中有retum语句执行过程与此类似
发生异常
try →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ 产生异常 对象
↓
↓
↓
进入catch块 ↓
异常类型
catch
return ←←←←←←←←←←←←←←←←←←←←←←←←← ←←←←←←←←←←←←←
↓
↓执行inally块
↓
finally
引发多种类型的异常
排列catch语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第-一个与异常类型匹配的catch语句
try-catch-finally结构中try语句块是必须的,catch,
finally语句块均可选,但两者至少出现之一
面试题: try-catch块中存在return语句,是否还执行
finally块?如果执行,说出执行顺序
try-catch- finally块中,finally块唯- 不执行的情况
是什么?
如果在一一个方法体中抛出了异常,如何通知调用者
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式1:调用者处理异常
方式2:调用者继续声明异常
main()方法声明的异常由Java虚拟机处理
除了系统自动抛出异常外,有些问题需要程序员自行
抛出异常
使用throw抛出异常
throw与throws
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出了异常 |
位于方法体内部,可作为单独语 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型, 可以跟多个异常 |
Exception和 Object
Error类的父类
由ava,应用程序
抛出和处理的非严重错误
仅靠程序本身无法
Throwable
恢复的严重错误
Error
Exception
运行时异常,不要求
程序必须做出处理
SQLException
RuntimeException
AWTError
ClassNotFoundException
ArithmeticExcqption
ThreadDeath
NullPointerExcepion
NumberF ormaltException.
Checked异常,程序
...
必须处理该类异常
全
当JDK中的异常类型不能满足程序的需要时,可以自定义异常类
使用自定义异常的步骤
1.定义异常类2.编写构造方法,继承父类的实现3.实例化自定义异常对象4.使用throw抛出
继承throwable类、继承Excepion 或者RuntimeException
A方法调用B方法时,B方法却抛出了异常。那A方法
继续抛出原有的异常还是抛出一个新异常呢?
抛出原有的异常
A方法与B方法进行了关联,不便于代码的修改和扩展
抛出新的异常
异常链创建了新的异常但却保留了原有异常的信息
异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理
Checked异常必须捕获或者声明抛出
运行时异常不要求必须捕获或者声明抛出
try-catch-finally中存在return语句的执行顺序
finally块中语句不执行的情况
throw和throws关键字的区别