Java基础篇-Java异常处理

概念

介绍

异常:就是程序在运行时出现不正常的情况

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是java对不征程情况进行描述后的对象体现

问题的划分

1)严重的问题 2)非严重的问题

问题的描述

1)对于严重的问题,java通过使用Error类进行描述

​ 对于Error一般不编写针对性的代码进行处理

2)对于非严重的问题,java通过Exception类进行描述

​ 对于Exception可以使用针对性的处理方式进行处理

说明

无论是Error还是Exception都具有一些的共性内容

比如不正常的情况信息引发原因等,于是向上抽取形成Throwable体系

Throwable

​ |–Error

​ |–Exception

异常处理

java提供了以下特有的语句进行异常处理

在这里插入图片描述

注意:如果在try中定义有变量,则这个变量只能在try语句范围内有效

实例:

在这里插入图片描述

对捕获异常对象进行的常见方法操作

1) String getMessage();//获取异常信息字符串

​ 说明:获取的只有异常信息,较为简单

在这里插入图片描述

2)String toString()//获取异常名称 :异常信息

​ 说明:获取的信息较为齐全

3)void prinStackTrace();//异常名称,异常信息,异常出现的位置

注意:jvm默认的异常处理机制就是在调用prinStackTrace方法。打印异常的堆栈跟踪信息

说明:信息最为齐全

异常声明throws

介绍

在程序的开发过程中,应该对可能出现异常并未处理的功能模块使用throws进行标识声明将,在调用者使用该功能模块时知道该模块可能出现问题,并进行异常处理,如果不处理将会出现编译失败的情况。

在这里插入图片描述

处理实例

对功能模块中声明的异常,主函数在使用的时候针对抛出的异常进行捕抓并做相对应的处理

在这里插入图片描述

多异常处理

1)在声明异常时,建议声明更加具体的异常。这样的处理更加的具体。

2)对声明的异常进行处理时一般使用更加具体的异常进行异常处理,提高正对性

3)提高异常处理的针对性可以在发生声明的具体异常意外出现的异常进行及时有效的处理

总结:当功能模块可能出现多个异常时一般使用多异常的处理机制进行处理

实例

1)多异常声明方法:throws 异常1,异常2

在这里插入图片描述

2)异常处理方法,书写对应的catch语句对捕获异常进行处理,如图所示

在这里插入图片描述

注意

​ 1)对方声明几个异常就有几个catch块进行异常处理,不要定义多余的catch块

​ 2)如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面

​ 3)建立catch处理时,catch中一定要定义具体处理方式,不要简单的定义一句 e.printStackTrace(),也不要简单的书写一条输出语句。

​ 4)正确的处理异常方式是将异常结果输出记录到异常记录文件,提供维护人员进行维护

自定义异常

介绍

Java针对了普遍有可能出现的问题进行了总结和封装成类的形式,但是在项目开发的过程中同样会出现异常,这些异常部分可能是项目的特有异常Java中是没有定义的,所以就需要开发人员自定义异常。

自定义异常类

1)将异常封装成一个类并继承Exception,注意必须是自定义类继承Exception

原因:异常体系有一个特点:因为异常类和异常对象都被抛出他们都具备可抛性,这个可抛性是Throwable这个体系中独有特点,只有这个体系的类和对象才可以被throws和throw操作

2)添加异常信息,直接定义构造函数接收异常信息并调用父类方法即可添加

在这里插入图片描述

原因:在父类的Throwable中已经定义了错误信息接收机制,子类直接使用父类构造方法即可

在这里插入图片描述

自定义异常方法

1)定义一个自定义的异常类

2)在功能模块中,达到了异常条件时将自定义异常手动抛出

3)对抛出异常对象进行处理,处理方式

(1)在函数内部使用try catch处理,如下图所示

在这里插入图片描述

(2)在函数上声明让调用者进行处理

注意:

(1)由于自定义异常非Java本身定义所以在编写功能模块时需要使用关键字throw将异常手动抛出

(1)编写功能模块时,功能模块内部引起的异常则在内部进行处理,如果是外部调用者导致的功能异常则将异常抛出由调用者解决(即谁直接导致或操作导致异常的发生谁就对该异常进行处理,不能层层抛出去)

实例

需求:在进行除法运算时,对于除数是负数的情况,也视为是错误的无法进行运算的

(1)自定义异常类

在这里插入图片描述

(2)功能模块

在这里插入图片描述

(3)调用者函数

在这里插入图片描述

throw和throws的区别

1)throws使用在函数上

2)throw使用在函数内

3)throws后面跟的异常类,可以跟多个。用逗号隔开

4)throw后跟的是异常对象(不仅限于自定义异常)

RuntimeException

介绍

对于异常分为两种:

1)编译时被检测异常

2)编译时不被检测异常(运行时异常。RuntimeException以及其子类)

RuntimeException是Exception中的特殊异常类

该异常类特点:

(1)在函数内部throw异常对象时,不需要在函数上声明,编译一样通过

(2)在函数上进行声明,调用者可以不进行处理,编译一样通过

原因:之所以不用在函数上进行声明是因为不需要调用者进行处理,当该异常发生时希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后对代码进行修正

实例

在这里插入图片描述

自定义异常新类型

自定义异常时:如果该异常的发生,无法继续进行运算,就让自定义异常继承RuntimeException

异常-finally

介绍:finally代码块存放着程序中一定会执行的代码

常用环境:常用于关闭资源

注意:finally只有一种情况不执行,当执行到System.exit(0),finally不会执行

异常-覆盖时的异常特点

1)子类在覆盖父类方法时,如果覆盖的父类方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或该异常的子类或者不抛出异常

2)如果在覆盖方法的时候出现了新的异常,这种情况不可以将异常抛出,而是将异常处理在函数内部

3)如果父类方法抛出多异常,那么子类在覆盖该方法时,只能抛出父类异常的子集

4)如果父类或者接口方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常,如果子类发生了异常就只能进行try处理,绝对不能抛出

总结

异常的好处

1)将问题进行封装

2)将正常流程代码和问题处理代码相分离,方便阅读

异常处理原则

1)处理方式有两种:try或者throws

2)调用到抛出异常的功能时,抛出几个就处理几个(一个try,对应多个catch)

3)多个catch,父类的catch放到最下面

4)catch内,需要定义针对性的处理方式。不要简单定义printStackTrace输出语句,也不要不写,当捕获的异常本功能处理不了时,可以在catch中抛出