本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第七章 异常处理
==java中的异常分为两部分==
- Error:JVM都无法解决的问题,比如jvm内部错误,资源耗尽等,例如StackOverflowError
- Exception:其他变成错误或者偶然的外部因素导致的可以使用专门的代码处理。例如:空指针等
1.常见的异常类型
graph LR
ta[java.lang.Throwable] --> er[java.lang.Error]
ta --> ex[java.lang.Exception]
ex --> c[非运行时异常]
c --> IO[IOException]
IO --> fnfe[FileNotFoundException]
c --> cnfe[ClassNotFoundException]
ex --> uc[运行时异常RuntimeException]
uc --> npe[NullPointerException]
uc --> ai[ArrayIndexOutOfBoundsException]
uc --> cce[ClassCastException]
uc --> nfe[NumberFormatException]
uc --> ime[InputMismatchException]
uc --> ae[ArithmeticException]
1.1 常见运行时异常解决方案
| 常见运行时异常 | 大概原因 | 关注点 |
|---|---|---|
| ArithmeticExecption(算术异常) | 一个整数除以0 | / x |
| NegativeArraySizeExecption | ||
2.异常处理机制
==异常的处理:抓抛模型==
过程一:“抛”,程序在执行的过程中,一旦出现异常,就会在异常代码出生成一个对应的异常类对象,并将此对象抛出,一单抛出一场对象以后,后边的代码就不再执行
过程二:“抓”,可以理解为异常的处理方式。①try - catch - finally ② throws + 异常类型
catch一般会有getMessage()he printStackTrace()==一般用这个==
2.1try - catch - finally
try{
//可能出现异常的代码
}catch(异常类型1 变量名){
//处理异常的方式1
}catch(异常类型2 变量名){
//处理异常的方式3
}finally{
//可选的,写不写都可以,写了的话就是一定会执行的代码
}
//JDK 7之后可以用 | 连接
try{
//可能出现的代码
}catch(异常类型1 | 异常类型2 e){
}
-
try保卫可能会出现异常的代码
-
catch捕获异常
-
finally一定会被执行的代码
范围小的异常要放在上边,
①使用try-catch-finally处理编译时异常,使得程序在编译时不在报异常,但是运行是可能报错,相当于讲一个编译时异常延迟到运行时出现了
②由于运行时异常比较常见,所以通常不针对运行时异常编写try- catch - finally,但是针对编译时异常一定要处理
③**finally里永远不要出现return语句,否则try-catch中间的return就不会执行**
2.2throws + 异常处理
- 一般写在方法声明处,说明可能会抛出的异常类型,当抛出异常的时候,后边的代码就不会执行了
如何选择使用哪一种异常处理机制
①如果父类中被重写的方法没有throws方式处理异常,那么子类重写的方法也不能使用throws,所以子类重写的方法只能用try - catch
②执行的方法a中,先后有调用另外的方法,而且是递进关机,建议使用throws方法处理,执行的方法a建议使用try-catch
2.3 throw new Exception
2.4异常对象的产生
①系统自动生成的异常对象
②手动生成一个异常对象并抛出**(throw)**
3.如何自定义异常
public class MyException extends RuntimeException{
static final long serialVersionUID = -12178941256195L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
4. 关闭资源
try{
n.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
m.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
o.close();
}catch(Exception e){
e.printStackTrace();
}
}
}