Java——异常
异常(意外)
程序没有语法错误,可能产生的运行时的错误
语法错误: —>编译不通过,编译错误
产生的原因
- 编程出现错误,数组越界,逻辑问题(一定要解决的)
- 用户不正当操作,程序员有相关的处理方式
异常的结构图
异常的处理
try-catch-finally方式
try{
//可能出现异常的代码
}catch(异常类型 异常对象){
//处理异常的代码
}catch()...
//catch可以写多个
//特殊的:在jdk1.8及以上中,catch中可以将多个异常类型写在一起 catch(异常类型1 | 异常类型2 |异常类型3 异常对象)
书写catch时:
当有多个异常时,同时两个异常类型之间没有父子关系,那么这些异常的顺序可以随意;但当这些异常之间存在父子关系时,书写要遵从先写子异常后写父异常的顺序
同时在讲多个异常折合写在一个catch中时,这些折合的异常之间不能存在父子 关系
简单记:先子后父,兄弟随意
catch匹配的原则:从上往下
执行流程:
没有产生异常 ------> 正常执行:把try中的代码全部执行完,但不会执行catch中的代码
产生异常 ------> 执行try中正常的代码—>遇到出现异常的代码,产生异常(产生异常后面的代码不会执行)---->产生异常对象和catch捕获的异常类型相匹配,跳转执行catch中的代码;如果不相匹配,jvm中断执行,把异常堆栈信息在控制台打印出来
try:存放可能出现异常的代码
catch:匹配异常,处理异常的代码
finally:最终地,里面放的代码一定执行
代码中既有return和finally,finally中的代码在return前面执行------> 这里强调的是在return的结束方法之前执行
过程:return返回一个值—>执行finally中的代码—>return结束方法 同时finally无法改变return的返回值
使用:
- try一定要和catch、finally中的至少一个一起使用,三个不能独立存在
- try-catch try-finally try-catch-finally
- try、catch、finally中定义的变量,只在他们自身的大括号内有效
finally和final的区别
finally | final |
---|---|
最终地 | 最终的 |
配合try使用 | 修饰方法、变量、属性 |
finally{ //代码 } 其中的代码是一定要执行的 |
throw + throws方式
throw 异常对象; //写在方法体内,抛一个一场对象,同时也会结束该方法 可以替换return
throws 异常类1,异常类2; //写在方法定义上,声明该方法可能会抛出什么类型的异常
细节:
- throw 异常对象:如果这个异常对象类型是编译时异常(非RuntimeException),一定要在方法上使用throws声明
- throw 异常对象:如果这个异常对象类型是运行时异常(RuntimeException),方法上可以使用throws声明,也可以不使用
- 如果方法调用了其他代码(方法),其他代码对该方法抛了一个异常,此时
- 可以使用try-catch处理该异常
- 也可以在方法上使用throws 异常类型,把这个异常继续网上抛,异常可以一直往上抛,都不处理,只能交给jvm处理;jvm处理方式:中断代码执行,在控制台输出异常堆栈信息
异常对象
自定义异常
根据业务需求,对某些情况,也希望有对应的异常类,但是jdk提供的异常中没有
此时,我们可以自己定义一个异常类
步骤
- 编写一个类
- 让这个类继承java.lang.Exception或者是其子类
- 根据父类的构造方法,生成本类的构造方法(通过super()实现)
此时,我们可以自己定义一个异常类
步骤
- 编写一个类
- 让这个类继承java.lang.Exception或者是其子类
- 根据父类的构造方法,生成本类的构造方法(通过super()实现)
- 在业务代码中,使用throw new 自定义异常类名