介绍
- 指的是程序在执行过程中,出现的非正常的情况,最终会导致
JVM
的非正常停止
异常体系
前提概念:Java
中所有的异常都是类
异常的继承体系结构
Throwable
Error
:严重级别的问题,常见的有堆栈溢出。
Exception
:
- 运行时异常:
RuntimeException
及其子类
- 特点:编译阶段不报错,运行的时候才出错, - 编译时异常:
!RuntimeException
及其子类
- 特点:代码语法正确,但是编译就是报错
起到提醒作用,告知使用者这段代码很有可能出错
需要我们对问题给出预处理方案,将来出现问题,直到怎么解决。
异常的处理方式
异常的默认处理流程
- 虚拟机会在出现异常的代码那里自动的创建一个异常对象:
ArithmeticEtiception
- 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机
- 虚拟机接收到异常对象后,先在控制台直接输出异常信息数据
- 直接从当前执行的异常点干掉当前程序
- 后续代码没有机会执行了,因为程序已经噶了
默认异常处理机制
- 创建一个异常对象,交给调用者处理
- 最终会交给虚拟机处理
- 虚拟机处理方式:
- 将异常信息打印在控制台并停止虚拟机运行
异常处理方式: try...catch...
- 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
- 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行
格式:
try {
可能会出现异常的代码
} catch (异常类名 对象名) {
异常的处理方式;
}
执行流程:
- 执行
try{ }
中的代码,看是否有问题产生 - 有:由
catch
负责捕获异常,执行异常处理方案,后续代码继续执行 - 没有:不执行
catch
内部的逻辑,代码继续执行
细节补充:
- 如果
try
语句中有多个异常,后面可以跟多个catch
- 如果编写了多个
catch
,最大的异常一定要放最后 JDk7
版本开始catch
中可以编写多个异常类名,中间使用|
进行分隔
**Throwable**
类的常见方法:
public void printStackTrace()
: 展示异常错误信息(位置,异常类名,原因)public String toString()
: 异常的简单描述(异常类名,原因)public String getMessage()
: 异常的简单描述(原因)
Student stu = new Student();
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
stu.setName(name);
System.out.println("请输入学生年龄:");
while (true) {
try {
int age = Integer.parseInt(sc.nextLine());
stu.setAge(age);
break;
} catch (NumberFormatException e) {
System.out.println("您的输入有误, 请重新输入:");
}
}
System.out.println(stu);
异常处理方式: throws
抛出
throws
: 用在方法上,作用是声明,声明这个方法中有可能会出现异常
思路:两种异常处理方式怎么选?
-线索: 看问题是否需要暴露出来
1. 需要:抛出
2. 不需要:`try...catch`捕获
public void setAge(int age) throws Exception {
if (age >= 0 && age <= 120) {
this.age = age;
}else {
throw new Exception();
}
}
System.out.println("请输入学生年龄:");
while (true) {
try {
int age = Integer.parseInt(sc.nextLine());
stu.setAge(age);
break;
} catch (NumberFormatException e) {
System.out.println("您的输入有误, 请重新输入:");
} catch (Exception e) {
System.out.println("您的输入的年龄范围有误, 请输入0-120之间的年龄:");
}
}
throw
和throws
的区别
throw
:用在方法中,后面跟的是异常对象,其作用是抛出异常对象
throws
:用在方法名后面,起到声明作用
声明此方法中存在异常,调用者需要进行处理
细节:
抛出的异常对象如果是编译时异常,必须使用throws
声明
如果是运行时异常,则不需要写throws
自定义异常的必要
Java
无法为这个世界上全部的问题提供异常类- 如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了