1.异常的分类–宏观认识

1.1树状图划分

在这个众多的异常里面,我们的这个所有的异常类都是继承自这个exception父类,而这个exception这个类又是我们的throwable的子类;
在这里插入图片描述
error这个类里面主要是涉及到这个系统内部分错误和资源的耗尽的错误,但是这个情况很少会出现;

我们一般关注的是这个exception这个类,也就是我们的java程序编写的时候出现的错误:这个类里面分为两个子类,一个就是我们的输入输出异常,一个就是运行时异常(这个一般是我们程序员自己的问题,需要我们自查并且进行修改);

1.2受查异常和非受查异常

在这里插入图片描述
上面的这个图里面,error下面的内容和这个runtimeException下面的内容都是我们的非受查异常,除此之外,这个体系里面的其他的异常都是我们的受查异常;

2.异常的引入(入门)

首先下面的这个如果除数是0,这个时候我们的程序肯定是无法正确执行的,因此我们引入了这个异常处理机制进行解决这个问题;首先选中这个可能会报错的语句,在这个案例里面就是这个num1/num2这个语句,看我们选中之后执行下面的这个快捷键的操作:

快捷键:ctrl+alt+t键进行这个窗口的调用,然后我们只需要选择这个try/catch这个选项,这个时候就会捕获异常

image-20241013214933114

下面的这个就是系统自动添加 的这个异常处理机制:

image-20241013215108874

但是上面的这个情况程序依然是无法正确运行的,因为这个输出的code是1,正常情况下应该是0,韩老师的这个填充的是我们的下面的这个printStackTrace这个内容,在这个情况下是可以正确执行的,程序的退出码是0;

可能是因为这个IDEA的系统版本的原因,总之就是觉得这个throw没有解决这个地方的问题,但是这个throw后面还会学到,我们先向后面学;

(现在我是写完了这个博客在回来解决我的这个困惑,实际上这个就是我们如果直接扔出去一个对象,没有进行处理的话,这个jvm最后处理就会把我们的这个程序挂掉,但是我们打印这个错误的信息就是正常执行的,我们的这个运行时异常需要不显示的写出来,默认就是这个throws异常处理机制,编译时异常需要我们显式地写出来);

image-20241014112354212

3.异常的体系介绍

在这个异常的体系里面,我们分为这个运行时异常和编译时异常,编译时异常就是我们程序员在书写代码的过程中,这个编译器检查出来的异常,运行时异常就是我们在编写这个代码的时候,这个编译器没有检查出来,但是运行的时候报错的异常,例如我们之前介绍的这个除数是0就属于这个里面的算术异常,在下面的这个导图里面展示出来5种常见的运行异常;

image-20241014114956851

4.五大运行异常

  1. 空指针异常:就是我们实例化一个对象是null,我们使用这个为null的对象去调用这个对象的属性或者是方法,这个时候的报错就是空指针异常;

  2. 数学算数异常:arithmetic异常,这个就是我么上面引入的案例,除数是0的情况,这个时候的异常就是数学算数异常;

  3. 数组越界异常:这个其实很好理解,访问的下标越界(超出这个数组的最大长度);

  4. 类型转换异常:我们的一个父类有两个子类,我们的任意一个子类和父类都是可以进行类型的转换的,这个就是向上转型和向下转型,但是我们的子类之间无法进行相互转换,如果是想要在子类之间进行相互转换,这个时候的错误就是类型转换异常;

  5. 数字格式转换异常:这个举一个例子说明,可能这个异常看上去不是那么直接:

    下面的这个例子里面,我们的name无法转换为这个int类型的num,因此这个时候的报错就是数字格式转换异常;

    image-20241014122216473

5.异常处理机制

5.1两个处理机制

两个机制分别是:

try catch–final处理:这个就是进行这个异常的捕获,try就是可能会出现异常的语句,cat就是进行这个异常的捕获,并且把这个捕获的异常放到我们的这个对象里面去,final是一定要执行的;

如果我们的这个程序并没有出现异常,这个时候,我们的这个catch就无法进行这个异常的捕捉,这个时候catch语句就不会执行,但是无论这个程序有没有异常,我们的这个final是一定会执行的;

image-20241014121459320

还有一个处理机制就是上面的这个throws这个方法,就是不断的把这个异常往回扔,自己不进行处理,而是让自己的上一层去处理,如果自己的上一层还是不处理,这个时候就会继续向上扔,最后直到被处理,如果一直扔到这个JVM上面,这个时候就会被直接退出程序,打印错误信息;

上面的两个处理的方式,我们只能选择其中的一个,如果没有选择,默认使用的就是我们的throws异常抛出的这个方式;

5.2try-catch捕获

这个没有finally,这个语法上面也是可以通过的:

  1. 如果异常发生了,这个异常后面的代码就不会执行了,而是直接进入catch代码块里面去;
  2. image-20241014123950634

我们可以同时捕获多个异常

getmessage就是去打印这个捕捉到的这个错误的信息内容,但是这个需要注意的是我们的多个catch语句的时候,子类需要放在这个父类的前面;

像下面的这个情况里面,我们的这个exception是我们上面的两个catch的父类,因为这个空指针异常和算数异常都是属于这个运行时异常,而这个运行时异常也是属于这个exception里面的一个情况,因此如果我们把这个exception这个异常放到前面,这个时候异常就会全部被捕获,后面的两个空指针和算数无法捕获,但是如果这个子类放到前面,两个子类可以捕获自己的这个对应的异常;

image-20241014124342717

6.try catch语句的练习

下面的这个里面是数组的空指针异常,因为我们的这个数组里面是没有任何内容的,这个时候空指针异常捕获,这个时候应该返回3,但是这个finally一定要执行,因此这个里面的返回值就是我们的finally里面的4

image-20241014190019861

下面的这个实际上是catch空指针的时候这个i已经等于3了,finally里面的这个++之后我们i=4,这个时候返回的就是4,相当于是这个finnally里面的这个返回结果覆盖了前面的返回值;

image-20241014190531475

下面的这个和上面的区别就是我们下面的这个里面的finally里面没有return的部分,i=3的时候这个时候会创建一个临时的变量temp,这个时候finally里面的这个i++之后等于4,这个时候输出4,但是我们的这个method的返回值实际上是这个temp里面存放的3;

image-20241014190602157

7.try-catch最佳实践

image-20241014191553854

我们先定义一个scanner对象,parseInt就是把我们输入的内容进行转换,如果转换成功,就会正常输出,否则就打印这个异常的错误信息,直到我们输入的是一个整数为止;

image-20241014192051673

8.异常处理机制(2)–throws

下面的这个就是默认的处理机制:就是在运行异常的情况下(我们下面的这个arith这个数组异常也是属于这个运行异常的,这个情况下的throw最后就是扔给了这个jvm,这个时候jvm就会直接把我们的程序挂掉;

image-20241014193129893

下面的是涉及到父子继承关系时候的这个异常地抛出规则:我们的子类的异常必须要是这个父类的异常的子类或者是和父类的异常相同;下面的这个子类的空指针异常就是我们父类的运行时异常的子类;

image-20241014192954658

下面的这个出现的是编译异常,因此如果我们的这个f1不进行任何的处理,这个时候就会报错,我们的这个f1里面必须要进行处理,要么去抛出throws,要么使用这个try–catch语句进行捕获异常;

要么在这个f1里面进行try-catch语句,要么继续使用这个throws进行异常的抛出;

image-20241014193519867

对于下面的这个,如果是运行异常,这个时候,我们是可以调用的,因为这个throws对于运行时异常会被自动调用,我们可以不用显示的写;

image-20241014193714477

9.自定义异常

下面的这个就是我们的自定义异常的调用:

super就是把我们在这个自定义异常里面的这个内容打印出来(如果遇到问题);

image-20241014195129407

如果我们的这个数值不在这个范围里面,就会报下面的这个类似的错误;

image-20241014195220830

一般我们会把这个自定义异常继承自运行时异常,这样可以有这个throws作为默认的异常处理机制;

10.异常的作业

image-20241014201900641

image-20241014203912773

这个里面我们使用到了这个main方法里面的这个参数,这个叫做命令行参数,如果我们直接运行,这个时候参数个数不匹配;

我们可以按照下面的这个方式进行这个参数的输入(而不是借助这个scanner对象)也是可以进行输入的

image-20241014203943998

我们输入两个符合条件的数据进行判断,也可以以输入一个参数,或者是输出字符串,看看这个相关的错误信息是否可以被捕获到;

image-20241014204005235

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部