1.异常的概述
异常:就是程序出现了不正常的情况。比如数组索引越界异常(循环length没有-1),算数异常(x/0)等等
2.异常的分类
- Error:错误,严重问题,比如内存溢出,程序处理不了。
- Exception:异常,程序可以处理的问题。
-
- RuntimeException以及子类:运行时异常,编译阶段不会出现问题,发生在运行阶段。 比如数组越界异常(ArrayIndexOutofBoundsException)
- 非 RuntimeException以及子类:没有继承RuntimeException,直接继承Exception是编译时异常,发生在编译阶段, 必须处理,否则程序不能通过编译,更不能正常运行了。比如日期解析异常(ParseException)
3.异常的处理
3.1. 处理方式一: JVM的默认处理(我们自己不作处理)
如果程序出现了问题,我们没有做任何处理,最终 JVM 会做默认的处理。
- 把异常的类型,异常的描述及异常的位置等信息打印在控制台
- 程序停止执行,异常下面的代码不会再执行了
3.2. 处理方式二:try…catch
自己处理异常,也叫做:捕获异常。
类似格式如下代码
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
好处:可以让程序继续往下执行。
3.3. 处理方式三: 抛出处理
使用throws或者throw进行异常抛出处理
throws:
写在方法声明后面,跟的是异常类名
表示声明异常,告诉方法调用者有可能会出现这样的异常。
throw:
写在方法体中,跟的是一个异常对象
表示手动抛出异常对象,告诉方法调用者出了这样的问题。
4. 异常体系常用方法
Throwable的成员方法
当我们在catch中捕获异常后,可以调用异常对象中的方法进行操作,异常中常用方法有以下3个:
-
public String getMessage() —— 获取异常的描述信息
-
public String toString() —— 获取异常的类型和描述信息
-
public void printStackTrace() —— 打印异常的类型,描述信息,位置
5. 自定义异常
JDK提供的异常类虽然比较多,但是不一定符合我们的需求。
此时我们需要根据自己业务的异常情况来定义自己的异常类,比如年龄负数问题,考试成绩负数问题。
自定义异常存在的意义:就是为了让控制台的报错信息更加的见名知意。
如何定义自定义异常
- 定义异常类
- 写继承关系
- 空参构造
- 带参构造
public class MyException extends RuntimeException {
public MyException() { }
public MyException(String message) {
super(message);
}
}