Java基础:Java异常体系
目录
图解:
异常机制为我们回答了:
Error和Exception的区别:
Exception中的RuntimeException和非RuntimeException:
常见异常:
RuntimeException:
非RuntimeException:
Error:
Java的异常处理机制:
标准异常处理流程
try-catch-finally
Java异常处理原则:
异常处理框架:
try-catch效率测试:
图解:
异常机制为我们回答了:
- What:异常类型回答什么异常被抛出
- Where:异常堆栈回答在哪抛出
- Why:异常信息回答为什么被抛出
Error和Exception的区别:
从概念角度分析Java异常处理机制:
Error:程序无法处理的系统错误,编译器不做检查。一般是指与JVM相关的问题,如系统崩溃、虚拟机错误、内存不足、方法调用栈溢出等。
Exception:程序可以处理的异常,捕获后可以恢复。
Exception中的RuntimeException和非RuntimeException:
- RuntimeException:不可预知,程序应自行避免
- 非RuntimeException:可预知,在编译器内校验的异常
从责任角度看:
- Error:JVM承担责任
- RuntimeException:程序承担责任
- Checked Exception可检查异常:编译器承担责任
常见异常:
RuntimeException:
1.当程序要在使用对象的地方使用null时,会有空指针异常。例如调用空的对象的实例方法、访问空对象的属性、计算空对象的长度等。
2.当AB不是父类与子类关系时,将A的实例a转换为B类时会出现的异常。
3.给方法传参是不满足参数要求、个数等。
4.数组下标为负或超出长度时。
5.将String转为数字时。
非RuntimeException:
Error:
1.找不到类定义的原因:
Java的异常处理机制:
标准异常处理流程
- 抛出异常→捕获异常→捕获成功(当catch的异常类型与抛出的异常类型匹配时,捕获成功)→异常被处理,程序继续运行
- 抛出异常→捕获异常→捕获失败(当cathc的异常类型与抛出异常类型不匹配时,捕获失败)→异常未被处理,程序中断运行
try-catch-finally
- try 块 负责监控可能出现异常的代码
- catch块 负责捕获可能出现的异常,并进行处理
- finally块 负责清理各种资源,不管是否出现异常都会执行
- 其中try块是必须的,catch和finally至少存在一个
Java异常处理原则:
- 具体明确:抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因;
- 提早抛出:应尽可能早的发现并抛出异常,便于精确定位问题;
- 延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常。
异常处理框架:
try-catch效率测试:
比较if与try-catch:
结果是try-catch用时更长,原因如下:
Java异常处理消耗性能的地方:
- try-catch块影响JVM的优化
- 异常对象实例需要保存栈快照等信息,开销较大
所以编程过程中try块内只写可能出现异常的代码,不要包含多余代码。