java 的异常处理 5 个关键字来实现
try, catch, finally, throw, throws
- 捕获异常
- try 执行可能产生异常的代码
- catch 捕获异常
- finally 无论是否发生一次,代码总能执行
- 声明异常
- throws 声明方法可能要抛出的各种异常
- 抛出异常
- throw 手动抛出异常
捕获异常
try-catch块
使用try-catch块捕获异常
在 try 代码块中捕获异常, 在 catch 中处理异常
public void method(){
try{
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 异常进行处理的代码段
}
// 代码段
}
在 catch 块中处理异常
-
加入用户自定义处理信息
System.err.println(“出现错误: XXXX”);
-
调用方法输出异常信息
e.printStackTrace();
-
异常对象常用的方法
方法 说明 void printStackTrace() 输出异常的堆栈信息 String getMessage(); 返回异常信息描述字符串,是printStackTrace()信息的一部分
在 try-catch 块中介入 finally
finally 块中 无论是否发生异常都执行
不执行的唯一情况: 在 try 块中 和 catch 块中 有中断程序,退出 Java 虚拟机的语句 ( System.exit(1) )
public coid method(){
try {
// 代码1
// 产生异常的代码段2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
} finally{
// 代码段4
// 即使 try-catch 中有return,也会执行 finally 中的代码
}
}
多重catch
引发多种类型的异常
- 排列 catch 语句的顺序: 先子类后父类
- 发生异常时按顺序逐个匹配
- 只执行第一个与异常类型匹配的 catch 语句
小结
- try-catch-finally 结构中 try 语句块是必须的, catch finally语句块可选, 但两者至少出现一次
- try-catch 中存在 return, finally还是会执行
- finally块中唯一不执行的情况: 在try-catch中出现 System.exit(1);
常见的异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
声明异常
如果在一个方法体中抛出异常,如何通知调用者
throws 声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式1:调用者处理异常
方式2:调用者继续申明异常
main()方法申明的异常有 Java 虚拟机处理
抛出异常
除了系统自动抛出异常, 有些问题需要程序员自行抛出异常
使用throw抛出异常
throw与throws
throw | throws |
---|---|
生成并抛出异常 | 声明方法内抛出异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象, 且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
自定义异常
当 JDk 中的异常类型不能满足程序的需求时, 可以自定义异常类
使用自定义异常类的步骤
- 定义异常类—> 继承Throwable类 继承 Exception 或者 RuntimeException
- 编写构造方法,继承父类的实现
- 实例化自定义异常对象
- 使用throw抛出
异常处理原则
- 异常处理与性能
- 异常只能用于非正常状态
- 不要将过于庞大的代码块放在 try 中
- 在 catch 中指定具体的异常类型
- 需要对捕获的异常做处理