java代码块如果出现异常_深入理解Java异常处理机制 (笼统篇)

有个疑问????     那么我们剩下的5行代码还会执行吗????

20180701153804139165.png

由上图可见,剩下的5行代码不会执行了,那么问题又来了!!!怎么才能让我们的代码执行完毕呢????

使用java中的异常处理机制!!!

那么什么是异常处理机制呢??

能让程序在异常发生时,按照代码预先设定的异常处理逻辑,针对性地处理异常,让程序回恢复正常并继续执行

一:所有异常和错误的父类--Throwable

Throwable类是Java异常类型的顶级父类,一个对象只有是Throwable类的实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常

根据编译器对异常的处理要求,异常分为两类:

01.运行时异常:在程序中运行期间产生的异常!

02.受查异常:在程序编译期间产生的异常!

20180701153804549295.png

二:异常的使用

1.异常的使用

异常处理方式分为两种:(5个关键字)

01.使用try...catch...finally

02.使用throw抛出异常和throws声明异常

2.try的使用

01.try块中放可能发生异常的代码:

20180701153804782679.png

20180701153805023874.png

02.try不能单独使用,必须和catch或者finally中的其中一个联合使用;

03.如果执行完try并且不发生异常,则接着去执行finally代码块和finally后面的代码;

04.如果发生异常,则尝试去匹配对应异常的catch代码块

3.catch的使用

01.每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。

20180701153805186950.png

02. catch后面的括号定义了异常类型和异常参数。

03.如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。

04.可以书写多个catch代码块!顺序必须是按照异常类型从小到大!

05.在catch块中可以使用异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。

20180701153805429122.png

06.如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally

20180701153805756249.png

07.如果try中没有发生异常,则所有的catch块将被忽略。

08.Java7中可以将多个异常声明在一个catch中

20180701153806029669.png

4.finally的使用

01.无论异常是否发生,finally代码块都会执行;

02.如果try代码块中出现return,先执行finally代码块之后return;

03.遇到System.exit(int status),不会执行finally代码块

System.exit(0):正常退出

System.exit(1或者非0):非正常退出,一般放置在catch代码块中

04.主要执行一些清理工作,比如关闭流,释放数据库连接资源......

5.try..catch..finally综合注意点

01.每个代码块中的变量都是局部变量,其他代码块不能访问;

02.try不能单独使用,必须和catch或者finally联合使用;

03.catch代码块可以有多个,书写顺序必须是按照异常类型的继承关系从小到大书写;

04.如果try代码块中出现了return,也是先执行finally之后再执行return

6.异常的使用小案例

需求:

01. 让用户分别输入两个数字

02.求两个数字的商

03.使用异常处理机制解决可能出现的异常情况

分析需求:

01.输入数字=====》输入流Scanner类

02. 求商      =====》使用算术运算符

03.使用try...catch...finally处理异常

f2940af480e1b4b65ede0eee02de2ab9.png

Scanner input = new Scanner(System.in);

try {

System.out.println("请输入第一个数字:");

int num = input.nextInt();

System.out.println("请输入第二个数字:");

int num2 = input.nextInt();

System.out.println("结果:"+(num/num2));

}catch(ArithmeticException e){

System.out.println("除数不能为0");

e.printStackTrace();

}catch (InputMismatchException e){

e.printStackTrace();

}finally {

System.out.println("结束!");

}

f2940af480e1b4b65ede0eee02de2ab9.png

三:throw和throws的使用

1.异常抛出的分类

01.系统自动抛出异常

我们没有使用异常处理机制,系统默认遇到异常时,抛出的异常!

02.书写语句抛出异常

使用throw抛出异常,throws声明异常

2.throw的使用

语法:

throw  new  异常类型([异常提示语句]);

注意点:

01.异常类型可以是Exception或者其子类;

02.一条throw语句只能抛出一个异常;

03.throw语句只能出现在方法体中

04.针对于thorw抛出的异常,有两种解决方式

001.使用try...catch...finally代码块处理异常

002.使用throws声明异常,把异常告诉调用者

20180701153806271841.png

20180701153806499366.png

2.throws的使用

语法:

方法名称  throws  异常类型1,异常类型2;

注意点:

01.thows声明在方法名称之后;

02.throws可以声明多个异常类型,每个类型之间使用 ‘逗号‘ 隔开;

03.throws声明表示当前方法可以不处理异常,而是由方法的调用者处理;

04.如果在主函数中使用throws声明异常,则由JVM处理异常!

四:异常链的使用

1.什么是异常链???

20180701153806878248.png

汽车A追尾了汽车B,

汽车B追尾了汽车C。

请问:

汽车C找谁赔偿?

找汽车B的司机赔偿,那罪魁祸首汽车A的司机呢?!

异常链是指将捕获的异常包装进一个新的异常中,新异常中记录了原始异常的信息。并重新抛出的异常处理方式。

好处:便于我们查找异常的根本原因。

20180701153807088195.png

20180701153807558868.png

20180701153807907479.png

20180701153808359598.png

五:自定义异常

20180701153808766799.png

自定义异常的注意事项:

1.异常类必须是Throwsable的子类

2.定义受查异常,建议继承Exception

3.定义运行异常,建议继承RuntimeException

六:使用异常的注意事项

1.异常的使用原则

01.异常只能用于非正常情况

02.为异常提供说明文档

03.尽可能的避免异常,特别是运行时异常

04.保持异常的原子性

05.避免过于庞大的try代码块

06.在catch中指定具体的异常类型

07.不要在catch块中忽略捕获的异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值