前言
为什么要进行异常处理
现存问题:
public static void main(String[] args) {
String str = "hello";
//str不是数字,会转行出错。
System.out.println(Integer.parseInt(str));
int i = 12;
System.out.println(i);
}
希望程序出错以后仍然能够继续运行下去。
Java中异常的体系结构
java中与异常处理相关的5个关键字
- try: try代码块中放可能产生异常的代码
- catch: catch代码块中放处理异常的代码
- finally:finally代码块中放一定会被执行的代码
- throw:throw用在代码中手工抛出异常
- throws:throws用在方法的声明部分,表示此方法会抛出异常
try和catch
try后面跟一个代码块,将可能产生异常的代码放在这个代码块里
catch处理异常的代码,catch后的小括号中必须定义一个异常类型的引用,用来接收try块抛出的异常对象。Try代码块产生异常时,异常信息被封装到某个类型的异常对象中,对象被传递给catch后面小括号中定义的异常类型的引用。
程序结构
try {
//可能产生异常代码
} catch (Exception e) {
//对异常处理代码
}
Try,catch的3种情况:
- 第1种:try块没有产生异常,try块里的代码执行完毕,不会进catch, 接着执行try,catch后面的其它代码
- 第2种:try块产生异常,并且产生的异常被正确的捕获到了,直接从产生异常的代码进入catch(产生异常的代码后的其它代码不会执行),catch块里的代码执行完毕后,接着执行try,catch后面的其它代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OimFiX1N-1585660760426)(第2种:try块产生异常,并且产生的异常被正确的捕获到了,直接从产生异常的代码进入catch(产生异常的代码后的其它代码不会执行)],catch块里的代码执行完毕后,接着执行try,catch后面的其它代码)
- 第3种:try块产生异常,并且产生的异常没有被正确的捕获到了,程序执行直接中断,和没有对异常进行处理是一样的。
假如try代码块里的代码可能产生多种异常,此时1个try对应多个catch
执行过程:
将产生的异常跟第1个catch里的异常类型进行比较,
假如异常类型匹配,进入这个catch代码块,catch代码块执行完毕,忽略其它的catch块,接下去执行try,catch块后的其它代码
假如不匹配,与下一个catch进行比较,直到找到匹配的,则进入匹配的catch块,catch代码块执行完毕,忽略其它的catch块,假如都不匹配,程序中断,相当于没有对异常进行处理。
注:当要捕获的多个异常存在父子关系的时候,子类在前,父类在后,否则会产生不可达的代码,编译报错;假如不存在父子关系,无所谓先后。
finally
finally代码块
无论前面的try…catch是3种情况下的哪一种,finally里面一定会被执行到。
finally代码块中通常写释放资源的代码
程序结构
try{
//可能产生异常的代码
}catch(Exception ex){
//处理异常的代码
}finally{
//一定会被执行的代码
}
try后面可以只跟catch(可以有多个), 也可以只跟finally(1个),也可以二者都有。
比如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJSoKgHV-1585660760427)(try后面可以只跟catch(可以有多个)], 也可以只跟finally(1个),也可以二者都有)
常见问题1:
常见问题2:
throw和throws
throw: 用在代码中手工抛出异常 。
语法:throw new 异常类();
throws: 用在方法的声明部分,告诉调用者此方法会抛出异常
抛异常的方法:
方法的调用者:
方法的调用者有2个选择:
1.处理异常
2.将异常继续向外抛出,假如已经是main方法,建议不要再向外抛。
自定义异常
继承Exception或者RuntimeExcepion, 实现空参构造和全参构造。
作者简介:一个有故事的程序员,我的微信号qiushuzhao222,欢迎大家找我聊天,记录你我的故事。