文章目录
📋前言
尽管人人希望自己身体健康,处理的事情都能顺利进行,但在实际生活中总会遇到各种状况,比如感冒发烧,工作时电脑蓝屏、死机等。同样,在程序运行的过程中,也会发生各种异常状况,例如,程序运行时磁盘空间不足、网络连接中断、加载的类不存在等。针对这种情况,Java语言引入了异常,以异常类的形式对这些非正常情况进行封装,通过异常处理机制对程序运行时发生的各种问题进行处理。本文将对异常进行详细讲解。
一.🔐什么是异常
1.1🔑案例引入
下面通过一个案例认识一下什么是异常,在本案例中,计算以0为除数的 表达式,运行程序并观察程序的运行结果。
代码如下👇🏻
package Example;
public class Example01 {
public static void main(String[] args) {
int result = divide(4, 0); // 调用divide()方法,第2个参数为0
System.out.println(result);
}
//下面的方法实现了两个整数相除
public static int divide(int x, int y) {
int result = x / y; // 定义一个变量result记录两个数相除的结果
return result; // 将结果返回
}
}
运行结果👇🏻
说明
由上图可知,程序发生了算术异常(ArithmeticException),提示运算时出现了被0除的情况。异常发生后,程序会立即结束,无法继续向下执行。
1.2🔑Throwable类
Java提供了大量的异常类,每一个异常类都表示一种预定义的异常,这些 异常类都继承自java.lang包下的Throwable类。
由上图中可知,Throwable类是所有异常类的父类,它有两个直接子类Error类和Exception类,其中,Error类代表程序中产生的错误,Exception类代表程序中产生的异常。
1.3🔑Throwable类的子类
(1)Error类称为错误类,它表示Java程序运行时产生的系统内部错误或资源耗尽的错误,这类错误比较严重,仅靠修改程序本身是不能恢复执行的。例如,使用java命令去运行一个不存在的类就会出现Error错误。
(2)Exception类称为异常类,它表示程序本身可以处理的错误,在Java程序中进行的异常处理,都是针对Exception类及其子类的。在Exception类的众多子类中有一个特殊的子类——RuntimeException类,RuntimeException类及其子类用于表示运行时异常。 Exception类的其他子类都用于表示编译时异常。
二.🔐编译时异常与运行时异常
2.1🔑编译时异常
在实际开发中,经常会在程序编译时产生异常,这些异常必须要进行处理,否则程序无法正常运行,这种异常被称为编译时异常,也称为checked异常。在Exception类中,除了RuntimeException类及其子类,Exception的其他子类都是编译时异常。编译时异常的特点是Java编译器会对异常进行检查,如果出现异常就必须对异常进行处理,否则程序无法通过编译。
处理编译时期的异常有两种方式,具体如下:
(1)使用try…catch语句对异常进行捕获处理。
(2)使用throws关键字声明抛出异常,调用者对异常进行处理。
2.2🔑运行时异常
另外还有一种异常是在程序运行时产生的,这种异常即使不编写异常处理代码,依然可以通过编译,因此被称为运行时异常,也称为unchecked异常。RuntimeException类及其子类都是运行时异常。运行时异常的特点是在程序运行时由Java虚拟机自动进行捕获处理的,Java编译器不会对异常进行检查。也就是说,当程序中出现这类异常时,即使没有使用try…catch语句捕获或使用throws关键字声明抛出,程序也能编译通过,只是程序在运行过程中可能报错。
在Java中,常见的运行时异常有多种,具体如下所示。
运行时异常一般是由程序中的逻辑错误引起的,在程序运行时无法恢复。例如,通过数组的索引访问数组的元素时,如果索引超过了数组范围,就会发生索引越界异常,代码如下所示:
package Example;
public class Example02 {
public static void main(String[] args) {
//运行时异常(在编译阶段是不需要处理的,是代码运行时出现的异常)
int []arr= {1,2,3,4,5};
System.out.println(arr[5]);
}
}
分析
在上面的代码中,由于数组arr的length为5,最大索引应为4,当使用arr[5]访问数组中的元素就会发生数组索引越界的异常。