一、什么是异常
程序运行时出现非正常情况,打断正常执行流程。语法没错才叫异常;语法写错属于编译错误,不算异常。
二、异常体系(顶层:throwable)
- error 错误 虚拟机严重问题,程序无法处理,不用捕获。例:栈溢出、内存溢出 oom。
- exception 异常(我们要处理)
- 受检异常(编译异常):编译强制要求处理,要么 try-catch 捕获,要么 throws 抛出。例:io 异常、文件不存在、线程睡眠异常。
- 运行时异常(runtimeexception):编译不报错,运行才出问题,大多是代码 bug,可处理可不处理。 常见:空指针、数组越界、除数为 0、类型强转异常、非法参数。
三、五个关键字用法
- try:包裹可能出错的代码
- catch:捕获对应异常并处理
- finally:无论是否异常基本都会执行,用来关闭流、释放资源;只有
system.exit()终止 jvm 时不执行 - throws:写在方法后面,声明该方法可能抛出异常,把异常交给调用方处理
- throw:方法内部手动主动抛出一个异常对象
throw vs throws
- throws:声明异常,被动报备
- throw:抛出异常,主动制造报错
四、多 catch 规则
多个 catch 时,子类异常必须写在父类前面,否则父类先匹配,后面子类永远走不到,编译报错。
五、自定义异常
业务场景专用,一般继承 runtimeexception,不用强制声明 throws,方便全局统一处理报错信息。
运行
public class mybizexception extends runtimeexception {
public mybizexception(string msg) {
super(msg);
}
}六、写代码小规范
- 别写空 catch,至少打印异常信息方便排错
- 尽量捕获具体异常,不要无脑直接捕获 exception
- 别用异常代替 if 判断做逻辑校验,损耗性能
- jdk7 + 可用 try-with-resources 自动关闭流,替代手写 finally 关资源
七、注意事项
- error 不可处理,exception 可处理
- 编译异常必须处理,运行时异常可不处理
- finally 绝大多数情况必执行
- throw 抛异常,throws 声明异常
八、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论