JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

释放双眼,带上耳机,听听看~!

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

一.异常的概述

异常算是程序中一个比较重要的环节了,我们首先来看一下异常的体系,我们举一个小例子,定义一个除法方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1//公共的   类   类名
2public class HelloJJAVA {
3    // 公共的 静态 无返回值 main方法 数组
4    public static void main(String[] str) {
5
6        Demo d = new Demo();
7        System.out.println(d.div(6, 2));
8    }
9}
10
11class Demo {
12    /**
13     * 定义一个除法
14     *
15     * @param a
16     * @param b
17     * @return
18     */
19    int div(int a, int b) {
20
21        return a / b;
22    }
23}
24

这段程序很好理解吧,就是除嘛,传6和2进去,的出来的结果肯定是3呀,但是,我现在传一个4和0,那输出的结果又会是什么呢?

OK,异常出现了

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

异常的由来

  • 问题也是现实生活中一个具体的事物,也可以通过JAVA的类的形式进行描述,并封装成对象,其实就是JAVA对不正常情况进行描述后的对象体现
  • 对于问题的划分,分为两种,一种是严重问题,一种是非严重问题,对于严重的问题JAVA通过ERROR类描述,非严重的,用Exception类来进行描述
  • 对于ERROR,一般不编写针对性的代码进行描述
  • 对于Exception可以通过正对性的处理方式进行处理

无论ERROR还是Exception,都具备一些共性的内容,比如:不正常情况的信息,引发原因等

  • Throwable

  • Error

    • Exception

Error的错误很多,你基本上很多都可以根据名字追到是什么错误

但是我们今天不讲Error,我们看的是异常

二.Try-Catch

Try-Catch就是抛出异常,也就是异常的处理


1
2
3
4
5
6
1    try {
2            //需要被检测的代码
3        } catch (Exception e) {
4            // 处理异常的代码(处理方式)
5        }
6

既然知道了处理方式,那我们就可以针对上面的异常进行处理了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1//公共的   类   类名
2public class HelloJJAVA {
3    // 公共的 静态 无返回值 main方法 数组
4    public static void main(String[] str) {
5
6        Demo d = new Demo();
7        try {
8            System.out.println(d.div(4, 2));
9        } catch (Exception e) {
10            System.out.println("异常");
11        }
12
13    }
14}
15
16class Demo {
17    /**
18     * 定义一个除法
19     *
20     * @param a
21     * @param b
22     * @return
23     */
24    int div(int a, int b) {
25
26        return a / b;
27    }
28}
29

对捕获的异常对象进项常见的处理方法

  • getMessage() 错误信息
  • toString() 转换成string的异常信息
  • printStackTrace 打印内存中的跟踪信息

三.异常声明Throws

我们不确定这段代码有没有问题,那我们就得去标识,怎么标识?Throws


1
2
3
4
5
6
7
8
9
10
11
12
1/**
2     * 定义一个除法
3     *
4     * @param a
5     * @param b
6     * @return
7     */
8    int div(int a, int b) throws Exception{
9
10        return a / b;
11    }
12

在功能上通过throws的关键字来声明了该功能有可能会出现问题,所以我们使用的时候就会有提示;

你不处理我就不让你用,提高了安全性

三.多异常处理

对多异常的处理方式是怎么样的呢?

  • 1.声明异常时,建议声明更为具体的异常,这样处理的可以更加具体
  • 2对方声明几个异常,就对应有几个catch块,如果多个catch块中的异常出现继承关系,父类异常catch放在最下面,不要定义多余的catch块
  • 3.建议在进行catch处理时,catch钟一定要定义具体处理方式,不要简单的定义一句显示格式

标准格式


1
2
3
4
5
6
7
8
9
1    try {
2
3        } catch (Exception e) {
4            // TODO Auto-generated catch block
5            e.printStackTrace();
6        } catch (NullPointerException e) {
7
8        }
9

也就是多catch

四.自定义异常

我们知道,异常分很多种,我们也可以自定义异常,也就是自己定义一些规则,因为项目中会出现一些特有的异常,而这些问题并未被JAV封装成异常,针对这些问题,我们可以按照JAVA对问题封装的思想,将特有的问题进行自定义的异常封装

如何去自定义异常?

需求,在本程序中,对于出书是-1?也视为是错误的,是无法进行运算的,那么就需要对这个问题进行自定义的描述

当在函数内部出现throw抛出异常对象,那么必须要给对应的处理动作

要么在函数上声明让调用者处理

throw关键字自定义异常,一般情况下,函数内出现异常,却没有需要声明,发现打印的就黑锅只有异常的名称,却没有信息,因为自定义的异常并未定义的信息

如何定义异常信息


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1//公共的   类   类名
2public class HelloJJAVA {
3    // 公共的 静态 无返回值 main方法 数组
4    public static void main(String[] str) {
5        Demo d = new Demo();
6        try {
7            d.dev(4, -1);
8        } catch (FushuException e) {
9            // TODO Auto-generated catch block
10            e.printStackTrace();
11        }
12    }
13}
14
15/**
16 * 负数异常
17 *
18 * @author LGL
19 *
20 */
21class FushuException extends Exception {
22
23    private String msg;
24
25    public FushuException(String msg) {
26        this.msg = msg;
27    }
28
29    @Override
30    public String getMessage() {
31        // TODO Auto-generated method stub
32        return msg;
33    }
34}
35
36class Demo {
37    int dev(int a, int b) throws FushuException {
38        if (b < 0) {
39            // 手动通过throw关键字抛出自定义异常对象
40            throw new FushuException("出现了除数是负数的异常");
41        }
42        return a / b;
43    }
44}
45

这段代码挺好玩的

但是其实我们有一点是不知道的,这个其实父类已经完成了,所以子类只要构造时,将构造信息传递给父类就行了,用super,那么就可以直接通过getMessage()方法来获取自定义的异常信息了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1/**
2 * 负数异常
3 *
4 * @author LGL
5 *
6 */
7class FushuException extends Exception {
8
9    private String msg;
10
11    public FushuException(String msg) {
12
13        super(msg);
14    }
15
16}
17
18

五.Throw和Throws的区别

我们来一个小插曲,就是异常的两个类的区别

Throw和Throws的区别

  • 1.Throws使用在函数上,Throw使用在函数内
  • 2.Throws后面跟异常类,可以跟多个,用逗号区别,Throw后面跟的是异常对象
  • 原文地址http://www.bieryun.com/2728.html

给TA打赏
共{{data.count}}人
人已打赏
安全技术

bootstrap栅格系统自定义列

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索