这篇文章,我们来讲一下java的异常体系
目录
1.异常概述
2 java的异常继承体系
2.1 编译时异常
2.2 运行时异常
2.3 底层原理
2.4 异常的作用
3.异常的处理方式
3.1 JVM默认的处理方式
3.2 自己处理(捕获异常)
3.2.1自己处理的4个问题
3.2.2 异常中的常见方法
3.3 抛出处理
3.3.1 throws
3.3.2 throw
4.小结
1.异常概述
首先,我们来认识一下异常
异常:异常就是代表程序出现的问题
注意:我们学习异常不是让我们以后写代码不出现异常,而是程序出了异常之后,我们应该如何处理
下面举个例子,来看一下异常:
java中有许多异常,上面举的只是两个简单的例子而已
2 java的异常继承体系
java中有许许多多的异常,这些异常组成了java的异常体系,下面来看一下:
下面来详细的说一下各个部分
- Error:代表的系统级别错误(属于严重问题)系统一旦出现问题,sun公司会把这些错误封装成Error对象。Error是给sun公司自己用的,不是给我们程序员用的。因此,我们开发人员不用管它
- Exception:叫做异常,代表程序可能出现的问题。我们通常会用Exception以及它的子类来封装程序出现的问题
- 运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常(如:数组索引越界异常)
- 编译时异常:编译阶段就会出现异常提醒(如日期解析异常)
注意:异常体系的最上层父类是Exception,而不是java.lang.Throwable
2.1 编译时异常
编译时异常,就是我们在写代码时,不运行就会出现的错误,idea中会用红色波浪线标记出来,如果我们不出来,则代码运行不了。
下面,我们通过具体的实例来看一下:
如上图所示,这就是编译时异常,我们可以进行相应的异常处理:
然后就可以正常运行了:
编译时异常是很好解决,我们可以直接在主方法上抛出异常就行
2.2 运行时异常
运行时异常就是RuntimeException及其子类,在编译阶段不会是出现异常提醒的。它运行时出现的异常(如:数组索引越界异常)
下面还是通过具体实例来看一下:
然后,我们运行看一下:
就会出现红色错误,然后指出错误类型,指出具体位置
这就是运行时异常。
2.3 底层原理
下面,我们来看一下为什么会出现编译异常和运行时异常两种异常
而我们的编译器在编译阶段,java是不会运行代码的,它只会检查语法是否有错误,或者做一些优化,所以就会出现这两种异常
2.4 异常的作用
下面,讲一下异常的作用
作用一:异常是用来查询bug的关键参考信息
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
这里就不举具体例子了
3.异常的处理方式
上面讲了异常的概念,异常体系,下面我们来讲一下异常的处理方式
异常的处理方式有三种,分别是:JVM默认的处理方式,自己处理,抛出异常
3.1 JVM默认的处理方式
当我们的代码中有异常的时候,如果我们没有自己处理,没有抛出异常,那么就会采用JVM的默认处理方式来处理
JVM的默认处理方式是这样的:
- 把异常的名称,异常原因以及异常出现的位置等信息输出在了控制台
- 程序停止运行,下面的代码就不会运行
下面看一下具体实例:
3.2 自己处理(捕获异常)
下面我们来看一下异常处理的第二种方式:自己处理
它的格式如下:
try{
可能出现异常的代码;
}catch(异常类 异常名){
异常的处理代码;
}
这样的目的:当代码出现异常时,可以让程序继续往下运行
下面通过具体实例来看一下:
再看一下结果:
下面,我们就上面的这个代码,来分析一下它的具体执行过程:
首先,程序进入到 try 里面,执行try里面的代码,如果出现了异常,它就会创建出相应的异常类对象,比如我们这里出的是索引越界异常,也就是ArrayIndexOutOfBoundsException异常,所以它就会创建一个ArrayIndexOutOfBoundsException异常对象,然后拿着这个对象到catch的小括号中进行比较,看括号中的变量能否接收这个对象(Exception是所有异常的父类),如果可以接收,那么就执行catch里面的代码,如果不可以接收,就会在编译时报错。这就是它的执行流程。
3.2.1自己处理的4个问题
下面,关于自己处理异常这种方式,或者说try { } catch( ) { } 这个方式,提几个问题。
问题一:如果try中没有遇到问题,怎么执行?
答:执行try中的代码,catch中的代码不执行
注意:只有出现异常,才会执行catch中的代码
看实例:
问题二:如果try中可能会遇到多个问题,怎么执行?
答:但凡try中出现异常,并且异常被捕获,那么就会执行catch,然后继续执行下面的代码,不会管其他的异常
注意:try中但凡出现一个异常,就会跳过try的部分
看实例:
问题三:如果try中遇到的问题没有被捕获,怎么执行?
答:那么程序会报错,以红色字体将错误打印在控制台,并且下面的代码不会继续执行
看实例:
问题四:如果try中遇到了问题,那么try下面的其他代码还会执行吗?
答:不会继续执行
注意:这种情况就相当于try白写了,异常就会交给JVM默认处理
看实例:
3.2.2 异常中的常见方法
在上面的案例中,当我们自己捕获到异常时,我们会定义一个异常类的对象e,然后在catch里面随意写点东西,这只是为了演示方便才这样做的。其实异常类里面有许多方法,下面就介绍几个常用的方法:
这些方法我们都可以通过异常类对象e来调用,下面演示一个案例:
3.3 抛出处理
抛出处理就是自己手动写抛出语句,将异常抛出。
抛出处理涉及到2个关键字,分别是 throws,throw;下面分别来看一下
3.3.1 throws
throws:写在方法的定义处,表示声明一个异常,作用是告诉调用者,使用本方法可能会出现哪些异常
注意:编译时的异常必须要写,运行时异常可以不写
格式如下:
public void 方法() throws 异常类名1,异常类名2……{
}
下面看一下具体实例:
因为没做其他处理,所以就是默认的输出这个异常
3.3.2 throw
throw:写在方法内,结束方法,它是手动抛出异常对象,交给调用者,方法下面的代码不再执行了
格式如下:
public void 方法{
throw new 异常类名();
}
下面看一下具体实例:
4.小结
这篇文章我们讲了一下异常。介绍了什么是异常,java的异常体系结构,和对异常的三种处理方法。都比较重要,都需要掌握。其实内容很简单,就是出错了,捕获它,匹配它,处理它,然后继续执行后面的代码。一般的处理方式就是输出打印它。