个人主页:Dawn黎明开始

系列专栏:Java
每日一句:什么都不做,才会来不及

欢迎大家:关注+点赞+评论+收藏⭐️


文章目录

前言

一.什么是异常

1.1案例引入

1.2Throwable类

1.3Throwable类的子类

二.编译时异常与运行时异常

2.1编译时异常

2.2运行时异常


前言

尽管人人希望自己身体健康,处理的事情都能顺利进行,但在实际生活中总会遇到各种状况,比如感冒发烧,工作时电脑蓝屏、死机等。同样,在程序运行的过程中,也会发生各种异常状况,例如,程序运行时磁盘空间不足网络连接中断加载的类不存在等。针对这种情况,Java语言引入了异常,以异常类的形式对这些非正常情况进行封装,通过异常处理机制对程序运行时发生的各种问题进行处理。本文将对异常进行详细讲解。

一.什么是异常

1.1案例引入

下面通过一个案例认识一下什么是异常,在本案例中,计算以0为除数的 表达式,运行程序并观察程序的运行结果。

代码如下

package Example;public class Example01 {public static void main(String[] args) {int result = divide(4, 0);// 调用divide()方法,第2个参数为0System.out.println(result);}//下面的方法实现了两个整数相除public static int divide(int x, int y) { int result = x / y;// 定义一个变量result记录两个数相除的结果return result;// 将结果返回} }

运行结果

说明

由上图可知,程序发生了算术异常(ArithmeticException),提示运算时出现了被0除的情况。异常发生后,程序会立即结束,无法继续向下执行

1.2Throwable类

Java提供了大量的异常类,每一个异常类都表示一种预定义的异常,这些 异常类都继承自java.lang包下的Throwable类

由上图中可知,Throwable类是所有异常类的父类,它有两个直接子类Error类和Exception类,其中,Error类代表程序中产生的错误,Exception类代表程序中产生的异常

1.3Throwable类的子类

(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]访问数组中的元素就会发生数组索引越界的异常。