【Java第十六期】:##异常:其实我没你想的那么难o(〃^▽^〃)o

hello!!
很高兴再次见到你们,没错,还是我,嘻嘻o(〃^▽^〃)o
欢迎来到肖肖的猪会飞小课堂
在这里插入图片描述

前言

还是说一声,文章不是最完美的,请各位见谅,如果哪里不够好,请各位大佬帮我指出哈,谢谢!!(。^▽^)
在这里插入图片描述
下面我们进入正文—》

1,什么是异常?

在Java中,将程序执行过程中发生的不正常行为称为异常。Java中的异常分为2种,一种是受查异常(编译时异常);一种是非受查异常(运行时异常);Java中不同类型的异常都有与其对应的类来进行描述。
下面是几种常遇到的异常:
(1)算术异常:
在这里插入图片描述
(2)数组越界异常
在这里插入图片描述
(3)空指针异常
在这里插入图片描述

2,异常处理

2.1,防御式编程

(1)LBYL:在操作之前就做充分的检查,也就是每走一步就运行一下,看一下是否抛出异常。
但是这种方法有很大的缺陷:正常的流程和错误的处理流程代码混在一起,代码整体比较混乱。
(2)EAFP:先操作,遇到问题再处理
格式:

try {
//可能发生异常的部分
}catch(){
//每一部分都捕捉一下,如果有异常的部分就抛出
}catch(){
//....
}...

相对于第一种,这种的优势:正常流程和错误流程是分开的,程序员更关注正常流程,代码更清晰,容易理解代码。异常处理的核心思想就是-----》EAFP。
在Java种,异常处理主要有5个关键字:throw、try、catch、final、throws

2.2,异常抛出

(1)在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告诉调用者。
语法格式:

throw new xxxException("异常产生的原因");

代码实例:
在这里插入图片描述
注意:
(1)throw必须写在方法体内部
(2)如果抛出了RunTimeException或RunTimeException的子类,则可以不用处理,直接交给JVM
(3)异常一旦抛出,其后面的代码无法执行

2.3,异常捕获

异常捕获有两种方式:异常声明throws和try-catch捕获处理
(1)异常声明
处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助throws将异常抛给方法的调用者处理,也就是当前方法不处理异常,提醒方法的调用者处理异常。
语法格式:

修饰符  返回值类型   方法名(参数列表) throws 异常类型1,异常类型2...{

}

例子:
在这里插入图片描述

注意:
(1)throws必须跟在方法的参数列表之后
(2)声明的异常必须是Exception或者Exception的子类
(3)方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型具有父子关系,直接声明父类即可。
(4)调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出
(5)快速处理的方法------》将光标放在抛出的异常方法上面,alt+insert快速处理。

2.4,异常捕获并处理

上面讲到的throws对异常没有真正的处理,而是将异常报告抛出给异常方法的调用者。如果要真正对异常进行处理,则要使用到try-catch
语法:

try{
//可能出现异常的代码
}catch(要捕获的异常类型   e){
//如果try中的代码抛出了异常,此处catch捕获时异常类型和try中抛出的异常类型一致,或者try中抛出异常的基类时,就会被捕获到
//对异常就可以正常处理,处理完成之后,跳出try-catch结构,继续执行后面的代码
}[catch(异常类型 e){
//处理异常
}finally{
//此处代码一定会被执行到
}]
/*
*后序代码
*当异常被捕获时,异常就被处理了,这里的后序代码一定会执行
*但是如果没有捕获到或者捕获到的类型不对,也相当于没有捕获到,则这里的代码就不会被执行
*上面的[]中国表示可选的选项,可以要,也可以不要
*try中的代码可能会抛出异常,也可能不会
*/

注意:
(1)try代码块内抛出异常的位置之后的代码不会被执行
(2)如果抛出异常类型和catch时的异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛出,直到jvm收到之后中断程序(异常按照类型来捕获)

例子:
在这里插入图片描述
这里的异常是数组越界异常,但是捕获的是空指针异常,也就是没有捕获到,如果捕获到了----》
代码:
在这里插入图片描述
之后是对后序的代码运行没问题的。
(3)try中可能抛出多个不同的异常,必须用多个catch来捕获,也就是多中异常,多次捕获。
如果是多个异常的处理方式完全相同,也可以写成这种形式:

catch(异常|异常|异常|...){
...
}

例子:
catch (ArrayIndexOutOfBoundsException | NullPointerException e) {

}
如果异常之间具有父子关系,一定是子类异常在前catch。父类异常在后catch,否则,编译器报错。
代码示例:
在这里插入图片描述
当换过来之后,代码------》
在这里插入图片描述
可以捕获了空指针异常。Exception可以一次捕获所有的异常。

2.5,finally

在写程序的时候,有些特定的代码,不论是程序是否发生异常,都要执行。比如程序中打开的资源:网络链接、数据库链接、IO流等,在程序正常或者异常退出的时候,必须要对资源进行回收。还有就是,因为异常会引发程序跳转 ,可能导致有些语句执行不掉,所以有finally。
上面的try-catch的写法中已经提过。它的作用就是无论语句有没有发生异常,finally里面的语句依然会被执行。
这里好像也没什么重要的内容**,但有一点需要注意的:finally中的代码一定会被执行,一般在finally中进行一些资源清理的扫尾工作。**
代码实例:
在这里插入图片描述
finally执行的时机实在方法返回之前(try或者catch中如果有return会在这个return之前执行finally)。但是如果finally中也存在return语句,那么就会执行finally中的return,从而不会执行到try中原有的return。

3,自定义异常类

Java中虽然已经内置了丰富的异常类,但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构。
代码实例:
在这里插入图片描述
所以,注意:
(1)自定义异常通常会继承自Exception或者RuntimeException
(2)继承自Exception的异常默认是受查异常
(3)继承自RuntimeException的异常默认是非受查异常

好了,以上就是异常的内容,,╰( ̄ω ̄o)
希望对你们有用!!
本期完了,Java基础语法到此结束就结束了,谢谢兄弟们的一路来的陪伴和支持!!爱你们o()q
在这里插入图片描述
好啦,谢谢收看小猪的博客,如果本篇对你有用,记得帮小猪点个小爱心哦!!
没关注小猪的赶紧关注哈,我带你一起学习!!
请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱撸猫的程序媛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值