目录
一、什么是异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力
二、Java中如何进行异常处理
1、异常处理的5个关键字
- 捕获异常
- try:执行可能产生异常的代码
- catch:捕获异常
- finally:无论是否发生异常,代码总能执行
- 声明异常
- throws:声明方法可能要抛出的各种异常
- 抛出异常
- throw:手动抛出异常
2、try-catch
try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 变量名) {
// 对异常进行处理的代码段
}
// 代码段
}
try语句块在执行中遇到异常,那么在try块中其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,则相应的catch块将会被执行
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
代码执行顺序:代码段1-->产生异常的代码段2-->catch语句-->对异常进行处理的代码段4-->代码段5
try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常类型不匹配,程序会中断。
public void method(){
try {
// 代码段 1
// 产生异常的代码段2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
代码执行顺序:代码段1-->产生异常的代码段2-->catch语句(不匹配)
多重catch块
public void method(){
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
3、try-catch-finally
存在return的try-catch-finally块
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
代码执行顺序:代码段1-->产生异常的代码段2-->catch语句-->对异常进行处理的代码段3-->代码段4-->return
try-catch- finally块中, finally块唯一不执行的情况
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
System exit(1);
}finally{
// 代码段 4
}
}
代码执行顺序:代码段1-->产生异常的代码段2-->catch语句-->对异常进行处理的代码段3-->System exit(1)
System exit(1)作用为:关闭Java虚拟机
4、throws
throws的用法
- Java语言中通过关键字throws声明某个方法可能抛出的各种异常。
- throws可以同时声明多个异常,多个异常用逗号隔开。
throws声明的异常,然后处理异常的方法
- 调用者通过try-catch捕获并处理异常。
- 调用者通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常。
- main()方法声明的异常将由Java虚拟机来处理。
public class Test7 {
public static void divide() throws Exception {
//可能出现异常的代码
}
// 方式1:调用者处理异常
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
e.printStackTrace();
}
}
// 方式2:调用者继续声明异常
/*public static void main(String[] args) throws Exception {
divide();
}*/
}
声明异常,多个异常用逗号隔开-->方式1:调用者处理异常
main方法声明的异常由Java虚拟机处理
throws与throw同时存在
throw不能单独存在
throws可以单独存在,但单独存在时无意义
5、throw
public class Person {
private String name = ""; // 姓名
private int age = 0; // 年龄
private String sex = "男"; // 性别
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
else {
// 抛出异常
throw new Exception(“性别必须是\"男\"或者\"女\"!");
}
}
}
6、throw和throws的区别
作用不同
throw用于在程序中抛出异常; throws用于声明在该方法内抛出了异常。
使用的位置不同
throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表后面,不能单独使用。
内容不同
throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。
7、异常的分类
8、自定义异常
一般顺序
- 定义异常类(继承Throwable类、继承Excepion 或者RuntimeException,一般为RuntimeException)
- 编写构造方法,继承父类的实现
- 实例化自定义异常对象
- 使用throw抛出
9、异常处理原则
- 异常处理与性能
- 异常只能用于非正常情况
- 不要将过于庞大的代码块放在try中
- 在catch中指定具体的异常类型
- 需要对捕获的异常做处理