Java异常处理训练营

46 阅读4分钟

本文讨论了Java中异常体系、自定义异常及异常处理方案

一、认识异常

什么是异常呢,在Java中,异常是代表程序代码在编译或者执行的过程中可能出现的错误。异常可以分为两种,一种是编译时异常,另一种是运行时异常。下面对这两种异常详细进行介绍。

1.1运行时异常

运行时异常特点是编译阶段不会报错,运行时才可能出现!提醒不属于激进型。例如数组越界,算数时除数为0等

​ ​​ 执行结果:数组越界异常:ArrayIndexOutOfBoundsException

 1.2编译时异常

编译时异常的特点是编译阶段就报错,提醒比较激进,例如读取磁盘某文件

运行结果:无法运行,激进提醒

 二、异常体系

异常体系最顶端是来自Java.lang.Throwable,可以分为两种,一种是Error,代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来,属于我们程序员无法管控的异常,这类异常一旦产生,编译程序都会直接崩溃。另一种是Exception,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的孩子来封装程序出现的问题。Exception是所有可管控异常的父类,实现孩子有RuntimeException和其他异常,除了RuntimeException外,其他异常均属于编译时异常。

三、异常处理

异常处理方案可以分为两种,一种是抛出异常,在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。格式是方法名 throws 异常类型。第二种是捕获异常,直接捕获程序出现的异常,格式是try{可能发生异常的代码}catch(异常类型 变量名){放捕获异常的代码,目的是给开发人员消息提示,给用户友好信息提示}。下面将对这两种方法进行实操演示

3.1抛出异常

在原有的读取磁盘某文件**编译时异常添加异常类型,可以是具体某种类型的异常,也可以是Exception,将底层的异常抛出去给最外层,最外层集中try...catch捕获处理。

 最外层已经捕获到test2抛出的异常,要进行try...catch处理,此时最外层不能继续throws向外抛,否则这个异常会直接响应给前台用户

3.2try...catch处理

刚刚我们讲到方法是可以对异常进行外抛给调用者统一处理,但也可以但对异常进行try...catch处理,那样可以防止程序阻塞,直接恢复程序

注意:为了解决使用父类异常导致职责不清晰的问题,在使用try...catch时,开发人员如果知道是异常的种类,应该给出具体的异常响应和友好提示给用户,如果不知道是何种异常,应该在最后补充一个应该补充一个父类异常,适配特殊情况

 四、异常的作用

4.1特殊返回值

有时候做一些算法运算时可能会产生算数异常的问题(如除数为0时,程序应该返回具体的异常问题而并标上-1,0这种结果,归根到底就是意义不明确),或者类型进行转换时可能会出现类型转换异常,这时候就可以通过异常信息来返回给调用者,方法执行的具体问题。

运行结果

4.2定位Bug

异常是用来定位程序bug的关键信息,在发生异常的地方会出现对应的代码位置,这时候只需要点击第1个代码就可以跳转到对应的异常代码位置

五、自定义异常

5.1为什么需要引入自定义异常?

Java无法为这个世界上全部的问题都提供异常类来代表, 如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。

5.2自定义运行时异常

实现步骤:

  1. 先定义一个自定义类 ​

  2. 继承运行时异常父类RuntimeException ​

  3. 重写构造器 ​

4. 通过throw new 异常类(xxx)来创建异常对象并抛出 ​

5.3自定义编译时异常

实现步骤:

  1. 先定义一个自定义类

  1. 继承运行时异常父类Exception

  1. 重写构造器

4. 通过throw new 异常类(xxx)来创建异常对象并抛出 ​​ ​

 也可以直接try...catch处理,恢复程序

 程序运行结果: