Java异常
程序员文章站
2022-05-31 13:14:44
...
异常是指在程序的运行过程中所发生的不正常事件,它会中断正在运行的程序.
避免异常1:通过if-else来避免异常问题
public class Test2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
…
System.out.print("请输入除数:");
int num2 = 0;
if (in.hasNextInt()) { // 如果输入的除数是整数
num2 = in.nextInt();
……
} else { // 如果输入的除数不是整数
System.err.println("输入的除数不是整数,程序退出。");
System.exit(1);
}
…
}
}
避免异常2:使用异常机制
public class Test2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
…
System.out.print("请输入除数:");
int num2 = 0;
if (in.hasNextInt()) { // 如果输入的除数是整数
num2 = in.nextInt();
if (0 == num2) { // 如果输入的除数是0
System.err.println("输入的除数是0,程序退出。");
System.exit(1);
}
} else { // 如果输入的除数不是整数
System.err.println("输入的除数不是整数,程序退出。");
System.exit(1);
}
…
}
}
弊端:
- 代码臃肿
- 程序员要花很大精力"堵漏洞"
- 程序员很难堵住所有"漏洞"
程序中的异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力:程序中预先设置好对付异常的处理办法–>程序运行–>异常–>对异常进行处理–>处理完毕,程序继续运行
Java中如何进行异常处理
Java的异常处理是通过5个人关键字来实现的:try,catch,finally,throw,throws
捕获异常 | |
---|---|
try | 执行可能产生异常的代码 |
catch | 捕获异常 |
finally | 无论是否发生异常,代码总能执行 |
声明异常 | |
---|---|
throws | 声明方法可能要抛出的各种异常 |
抛出异常 | |
---|---|
throw | 手动抛出异常 |
try-catch块:使用try-catch块捕获异常,分为三种情况.
1.第一种情况:正常
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
2. 第二种情况:出现异常
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程.
3.第三种情况:异常类型不匹配
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
在catch块中处理异常
- 加入用户自定义处理信息
System.err.println("出现错误:被除数和除数必须是整数, ” +"除数不能为零。");
- 调用方法输出异常信息
e.printStackTrace();
- 异常对象常用的方法
方法名 | 说明 |
---|---|
void printStack Trace() | 输出异常的堆栈信息 |
String getMessage() | 返回异常信息描述字符串,是printStackTrace()输出信息的一部分 |
- 常见的异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
异常处理
- 在try-catch块后加入finally块
是否发生异常都执行
不执行的唯一情况
- 存在return的try-catch-finally块
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
- 多重catch块
引发多种类型的异常
排列catch 语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句
public void method(){
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
声明异常
抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常.
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(“性别必须是\"男\"或者\"女\"!");
}
}
}
Checked和Unchecked异常
观察以下两组代码:
Class.forName("");
Integer.parseInt("123");
为什么有的异常一定需要catch,有的却不用?
- Java当中Checked异常是必须catch并处理的,而unchecked异常不强制要求程序员处理
- 在处理checked异常的catch语句中,不要什么都不做
- 不要直接catch Exception,这样会处理所有的异常包括checked和unchecked
异常的分类原理
总结
异常分为Checked异常和运行时异常 - Checked异常必须捕获或者声明抛出
- 运行时异常不要求必须捕获或者声明抛出
try-catch-finally中存在return语句的执行顺序
finally块中语句不执行的情况
throw和throws关键字的区别