一、异常
1、什么是异常?
- 异常是程序在 “编译” 或者 “执行” 的过程中可能出现的问题,注意:语法错误不算在异常体系中。
- 比如:数组索引越界、空指针异常、日期格式化异常,等…
2、为啥要学异常?
-
异常一旦出现了,如果没有提前处理,程序就会退出
JVM虚拟机
而终止。package com.app.d4_exception; /** 目标:学习异常 */ public class ExceptionDemo { public static void main(String[] args) { // 不处理异常,程序就会终止 int[] arrs = {10, 20, 30}; System.out.println(arrs[0]); System.out.println(arrs[1]); System.out.println(arrs[2]); System.out.println(arrs[3]); System.out.println("------程序截止------"); } }
- 研究异常并且避免异常,然后提前处理异常,体现的是程序的安全、健壮性。
3、异常体系
Error:
- 系统级别问题、JVM退出等,代码无法控制。
Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题。
- RuntimeException及其子类:运行时异常,编译阶段不会报错。(空指针异常,数组索引越界异常)
- 除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。(日期格式化异常)
4、编译时异常和运行时异常
简单来说:
- 编译时异常就是在编译的时候出现的异常;
- 运行时异常就是在运行的时候出现的异常。
总结
1、异常是什么?
- 异常是代码在编译或者执行的过程中可能出现的错误。
2、异常分为几类?
- 编译时异常、运行时异常;
- 编译时异常:没有继承RuntimeException的异常,编译阶段就会出错;
- 运行时异常:继承自RuntimeException的异常或其子类,编译阶段不会报错,运行可能报错。
3、学习异常的目的?
- 避免异常的出现,同时处理可能出现的异常,让代码更稳健。
二、常见运行时异常
1、运行时异常
- 直接继承自 RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。
2、运行时异常示例
- 数组索引越界异常:ArrayIndexOutOfBoundsException
- 空指针异常:NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
- 数学操作异常:ArithmeticException
- 类型转换异常:ClassCastException
- 数字转换异常:NumberFormatException
运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误!
package com.app.d5_exception_runtimeException;
import java.util.stream.Stream;
/**
目标:理解什么是运行时异常。
运行时异常继承自 RuntimeException,编译阶段不会报错,运行时才可能会出错误!!
*/
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("程序开始...");
/** 1、数组索引越界异常:ArrayIndexOutOfBoundsException */
int[] arr = {1, 2, 3};
// 索引: 0 1 2
System.out.println(arr[2]);
// System.out.println(arr[3]); // 报错:数组索引越界了!程序终止
/** 2、空指针异常:NullPointerException。直接输出没有问题,但是调用空指针的变量的功能就会报错!*/
String name = null;
System.out.println(name); // null
// System.out.println(name.length()); // 报错:地址为空,无法访问。程序终止
/** 3、类型转换异常:ClassCastException */
Object o = 25;
// String s = (String) o; // 报错:25是整型类型,不能转换为字符串类型
/** 4、数学操作异常 */
// int c = 10 / 0; // 报错:0不能作为除数
/** 5、数字转换异常 */
// String number = "55"; // 没有问题!
// String number = "55asff"; // 报错:字母无法转换成整数类型
// Integer it = Integer.valueOf(number);
// System.out.println(it);
System.out.println("程序结束.");
}
}
三、常见编译时异常
1、编译时异常
- 不是 RuntimeException或者其子类的异常,编译阶段就报错,必须处理,否则代码不通过。
2、编译时异常示例
3、编译时异常的作用
- 是担心程序员的技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错!!
- 编译时异常是可遇不可求,遇到了就遇到了呗。
总结
1、编译时异常的特点
- 编译时异常:继承自Exception的异常或者其子类;
- 编译阶段就报错,必须处理,否则代码不通过。
四、异常的默认处理流程
1、默认会在出现异常的代码那里自动的创建一个异常对象;
2、异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机;
3、虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据;
4、直接从当前执行的异常点干掉当前程序;
5、后续代码没有机会执行了,因为程序已经终止了。
总结
1、默认异常处理机制
- 默认的异常处理机制并不好,一旦真的出现异常,程序就会立即终止。