开篇
1.异常处理(Exception Handling):
就是一种解决这一问题的机制,能够较好地处理程序不能正常运行的情况。
2.异常(Exception):
是程序在运行时可能出现的会导致程序运行终止的错误。这种错误是不能通过编译系统检查出来的。
3.常见异常如下:
(1)系统资源不足。例如,内存不足,不可以动态申请内存空间;磁盘空间不足,不能打开新的输出文件等。
(2)用户操作错误导致运算关系不正确。例如,出现分母为0。数学运算溢出,数组越界,参数类型不能转换等。
4.异常例子:
在C++中,使用try、throw、catch三个关键字来实现异常处理。
try后面的复合语句称为受保护段,受保护段的代码有可能出现异常,因此在try部分进行异常检测。如果检测到异常,就通过throw语句抛掷这个异常。受保护段所调用的函数中也可以检测和抛掷异常。所抛掷的异常,可以是一个整数、一个字符串、一个变量,甚至是一个类的对象。也就是说,异常是有不同类型的。
catch部分的作用是捕获异常和处理异常。每个catch后的括弧内,都要指定一个“异常类型”,表明它可以捕获哪种类型的异常。一旦捕获到异常,就通过异常处理语句来进行处理。
程序执行的流程有两种:
(1)没有异常:try-->受保护语句-->其他语句。
(2)有异常:tyr-->受保护语句-->throw异常-->catch-->异常处理语句。
在编写带有异常处理的程序时,还要注意:
(1)try语句块和catch语句块是一个整体,两者之间不能有其他的语句。
(2)一个try语句块后面可以有多个catch语句,但是。不可以几个try语句块后面用一个catch语句。
5.程序中的异常
有个疑问???? 那么我们剩下的5行代码还会执行吗????
由上图可见,剩下的5行代码不会执行了,那么问题又来了!!!怎么才能让我们的代码执行完毕呢????
使用java中的异常处理机制!!!
那么什么是异常处理机制呢??
能让程序在异常发生时,按照代码预先设定的异常处理逻辑,针对性地处理异常,让程序回恢复正常并继续执行
一:所有异常和错误的父类--Throwable
Throwable类是Java异常类型的顶级父类,一个对象只有是Throwable类的实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常
根据编译器对异常的处理要求,异常分为两类:
01.运行时异常:在程序中运行期间产生的异常!
02.受查异常:在程序编译期间产生的异常!
二:异常的使用
1.异常的使用
异常处理方式分为两种:(5个关键字)
01.使用try...catch...finally
02.使用throw抛出异常和throws声明异常
2.try的使用
01.try块中放可能发生异常的代码:
02.try不能单独使用,必须和catch或者finally中的其中一个联合使用;
03.如果执行完try并且不发生异常,则接着去执行finally代码块和finally后面的代码;
04.如果发生异常,则尝试去匹配对应异常的catch代码块
3.catch的使用
01.每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。
02. catch后面的括号定义了异常类型和异常参数。
03.如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
04.可以书写多个catch代码块!顺序必须是按照异常类型从小到大!
05.在catch块中可以使用异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
06.如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally
07.如果try中没有发生异常,则所有的catch块将被忽略。
08.Java7中可以将多个异常声明在一个catch中
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处理异常
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("结束!"); }
三: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声明异常,把异常告诉调用者
2.throws的使用
语法:
方法名称 throws 异常类型1,异常类型2;
注意点:
01.thows声明在方法名称之后;
02.throws可以声明多个异常类型,每个类型之间使用 ‘逗号‘ 隔开;
03.throws声明表示当前方法可以不处理异常,而是由方法的调用者处理;
04.如果在主函数中使用throws声明异常,则由JVM处理异常!
四:异常链的使用
1.什么是异常链???
汽车A追尾了汽车B,
汽车B追尾了汽车C。
请问:
汽车C找谁赔偿?
找汽车B的司机赔偿,那罪魁祸首汽车A的司机呢?!
异常链是指将捕获的异常包装进一个新的异常中,新异常中记录了原始异常的信息。并重新抛出的异常处理方式。
好处:便于我们查找异常的根本原因。
五:自定义异常
自定义异常的注意事项:
1.异常类必须是Throwsable的子类
2.定义受查异常,建议继承Exception
3.定义运行异常,建议继承RuntimeException
六:使用异常的注意事项
1.异常的使用原则
01.异常只能用于非正常情况
02.为异常提供说明文档
03.尽可能的避免异常,特别是运行时异常
04.保持异常的原子性
05.避免过于庞大的try代码块
06.在catch中指定具体的异常类型
07.不要在catch块中忽略捕获的异常
原文地址:https://www.cnblogs.com/lsy131479/p/9250257.html