java基础知识——25.异常

这篇文章,我们来讲一下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的异常体系结构,和对异常的三种处理方法。都比较重要,都需要掌握。其实内容很简单,就是出错了,捕获它,匹配它,处理它,然后继续执行后面的代码。一般的处理方式就是输出打印它。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L纸鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值