- 异常:就是程序出现了不正常的情况, 程序在执行过程中, 数据导致程序不正常,最终会导致JVM的非正常停止。
异常的种类
- 编译时异常就是在编译的时候可能出现的异常, 编译时期必须处理, 否则程序无法执行
- 运行时异常就是在运行时可能出现的异常, 在编译时期不需要处理
异常的本质
- 当程序中产生异常时, 其实就是在异常的位置创建了一个该异常的对象, 该对象携带了异常相关的信息。因此, 异常就是Java中提供的异常类的对象
异常的体系
异常产生后会怎样
- 程序中一旦产生异常, 首先会中断向下执行。异常的传递要根据处理方式而定, 如果没有处理, 默认是将异常传递给本方法的调用者。不断往回传递,直到JVM收到该异常,此时程序终止执行。
手动处理异常-声明与抛出
- 声明异常 - throws
- 格式: 修饰符 返回值类型 方法名(参数列表) throws 异常类型1, 异常类型2… {…}
- public void show(int[ ] arr) throws NullPointerException, ArrayIndexOutOfBoundsException{ }
- 作用
- 告知调用者当前的方法可能会出现某些异常,使用时需要注意
- 如果当前的方法中没有出现任何异常, 那么代码会正常执行
- 如果当前的方法中出现了异常, 会把异常交给本方法的调用者处理
- 如果声明的多个异常有子父类关系, 那么只要声明一个父类即可(多态)
- 抛出异常 - throw
- 抛出异常就是自己手动创建一个异常对象
- 格式: throw new 异常类名();
- throw new NullPointerException();
- 注意:
- 抛出异常的格式必须在方法的内部完成
- 如果手动抛出一个异常, 下面的代码无法执行
手动处理异常-捕获异常
- 之前的声明或抛出都是将异常传递出去, 让调用者知晓异常信息
- 捕获异常是在本方法的内部对异常进行处理, 能够阻止异常的传递, 从而保证程序能够继续往下执行
- 格式:
try{
存放可能会出现异常的代码
} catch (异常类型 变量名) {
处理异常方案
例如 打印异常 将异常原因记录在日志中
}
- 多异常捕获的处理方案
自定义异常
- 当JDK中的异常类型, 不满足实际的业务需要时, 就可以自己定义异常, 例如, 学生的年龄数据, 如果是负数或者数据超过了150认为是不合法的, 就需要抛出异常。JDK中就没有表示年龄的异常, 就需要自己定义异常了。
public class AgeOutOfBoundsException extends RuntimeException {
public AgeOutOfBoundsException() {
}
public AgeOutOfBoundsException(String message) {
super(message);
}
}
- 注意:
- 如果要定义编译时异常 就继承Exception
- 如果要定义运行时异常 就继承RuntimeException
public class Test01 {
public static void main(String[] args) {
checkAge(200);
}
public static void checkAge(int age) {
if (age < 0 || age > 150) {
throw new AgeOutOfBoundsException("年龄不合法");
}
System.out.println("年龄为: " + age);
}
}
总结