七, 异常体系
1. 异常基础知识
1. 异常的定义
-
Exception: 异常就是代表程序出现问题, 我们通常会用Exception以及它的子类来封装程序出现的问题, 包括
- 运行时异常: RuntimeException及其子类, 编译阶段不会出现异常提醒, 运行时的异常: 如数组索引越界异常
- 编译时异常: 除了RuntimeException及其子类, 都是编译时异常, 编译阶段就会出现异常的: 如日期解析异常
-
误区: 不是不让出现异常, 关键在于异常出现怎么处理
-
java.lang.Throwable: 包含Error和Exception
-
Error: 代表的系统级别错误(属于严重问题)
系统一旦出现问题, sun公司会把这些错误封装成Error对象
Error是给sun公司自己用的, 不是给程序员用的, 所以我们无需管 -
异常的作用:
- 异常是用来查询bug的关键参考信息
- 异常可以作为方法内部的一种特殊返回值, 以便通知调用者底层的执行情况
2. 异常的处理方式
2.1 JVM默认的处理方式
- 把异常的名称, 异常原因以及异常出现的位置等信息输出在了控制台
- 程序停止执行, 下面的代码不会再执行了
2.2 捕获异常(自己处理)
1. 格式
- 当代码出现异常时, 可以让代码继续往下执行
- 格式:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码
}
int[] arr = {1, 2, 3, 4, 5};
try{
System.out.println(arr[10]); // 此处出现了异常, 程序会在这里创建一个异常对象
// new ArrayIndexOutOfBoundsException();
// 拿着这个对象到catch的小括号中对比, 看括号中的变量是否可以接收这个对象;
// 如果能被接收, 就表示该异常被捕获, 执行catch里面的代码;
// 当catch里面所有的代码执行完毕, 就会继续执行try catch之后的代码;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界了");
}
System.out.println("是否执行到此处");
-
如果try没有遇到问题, 会把try里面的代码全部执行完毕, 不会执行catch里面的代码
-
如果try中遇到多个问题, 要写多个catch进行接收, 多个异常如果存在父子关系, 一定要将父类写在下面
-
如果try中遇到的问题没有被捕获, 会使用虚拟机默认处理方式
-
如果try遇到了问题, try下面的代码不会执行了, 直接跳转到相应的catch语句中, 执行catch里面的语句体


2. 异常中的常见方法
- printStackTrace() 在底层是利用System.err.println进行输出: 把异常的信息仅仅是用红色字体输出在控制台

int[] arr = {1, 2, 3, 4, 5};
try {
System.out.println(arr[10]);
} catch (ArrayIndexOutOfBoundsException e) {
// System.out.println(e.getMessage());
// System.out.println(e.toString());
e.printStackTrace();
}
System.out.println("是否执行到此处");
2.3 抛出异常(交给调用者处理)
- 在方法中, 出现异常了, 方法就没有继续执行下去的意义了, 此时抛出异常, 让该方法结束运行并告诉调用者出现了问题

// 需求: 定义一个方法求数组的最大值
int[] arr = new int[0];
int max = 0;
try {
max = getMax(arr);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(max);
}
public static int getMax(int[] arr) /*throws NullPointerException, ArrayIndexOutOfBoundsException*/{
if(arr == null){
// 手动创建一个异常对象, 并把这个异常交给方法的调用
// 此时方法结束, 下面的代码不会执行
throw new NullPointerException("数组不能为null");
}
if(arr.length == 0){
throw new ArrayIndexOutOfBoundsException("数组不能为空");
}
System.out.println("look exexcuted");
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return 1;
}
3. 自定义异常
- 自定义异常意义就是为了让控制台的报错信息更加地见名知意
- 自定义异常包括: (1) 定义异常类 (2) 写定义关系 (3) 空参构造 (4) 带参构造


浙公网安备 33010602011771号