目录
1.异常
Java中的异常机制是基于面向对象的一种运行错误处理机制,Java把大部分可能存在的异常信息都封装在各自对应的类,所有这些异常类都继承自Throwable类,而Java中出现的异常都是对象。
一旦出现异常,运行的程序就会中断。
如果在程序代码中,有多个异常的存在时,程序代码执行遇到的第一个异常时,就会程序中断,程序只会报第一个异常信息。
2.Throwable
Throwable
类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw
语句抛出。
图 1 Throwbale类是继承了Object类,实现了Serialize接口(可序列化)
3.Error 和 Exception
Throwable类的两个子类是Error和Exception。
Error类及其子类会在Java程序运行中发生内部错误或导致内存资源不足时而被抛出,此时程序会被直接终止;
Exception类及其子类是通过异常捕获的方式对开发人员或程序重的错误进行提示,程序会继续执行,不会被终止。
Error类被抛出时 | 一般是程序内部出现了较为严重的错误 |
Exception类被抛出时 | 一般是程序出现了运行时异常和非运行异常 |
运行时异常 (非检查异常):小错误,代码写的问题,不符合代码逻辑
java.lang.ArithmeticException-算术异常
java.lang.NullPointerException-空指针异常
非运行异常(检查异常)执行代码之前需要检查 ,没有非运行异常,程序代码会存在
4.异常处理关键字
throw throws | java中抛出异常使用的关键字时 throw和throws |
try catch | java中通过try catch语句来捕获异常 |
finally | 一般再try catch代码块后面都会紧跟着finally代码块, 通常情况下,无论程序是否异常,finally代码块都会正常运 |
try块 | 用来判断运行的代码是否有异常 |
catch块 | 如果有异常则执行catch块,没有异常不执行catch块的程序代码 |
finally块 | 无论是否有异常,都会执行 |
catch(Exception e)
catch 写Exception的是,异常由级别低的异常到级别高的异常;
捕获异常: try - catch - finally (三个块可以嵌套使用的)
try - catch - finally(不是跳转语句)
注意:
1.不要在finally块中处理返回值
在finally代码块中使用return关键字时一定要慎重,finally代码块中的return返回值逻辑会直接覆盖try块代码块中正常的return返回值;
2.建议封装异常
3.针对不同的异常进行捕获
5.自定义异常
Java本身内置的大量异常类覆盖了大部分的编程异常场景,但是有时开发者需要自定义一些规则和异常情况。
自定义异常可以处理某些特殊的、超出期望的业务逻辑。
6.常见的运行时异常
1.数组索引越界异常: ArrayIndexOutOfBoundsException
2.空指针异常 : NullPointerException
直接输出没有问题。但是调用空指针的变量的功能就会报错!
3.类型转换异常:ClassCastException
4.迭代器遍历没有此元素异常:NoSuchElementException
5.数学操作异常:ArithmeticException
6.数字转换异常: NumberFormatException运行时异常继承了RuntimeException ,编译阶段不报错,运行时才可能会出现错误
7.异常默认执行流程
异常的产生默认的处理过程解析。(自动处理的过程)
- 默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException
- 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机
- 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据
- 直接从当前执行的异常点干掉当前程序
- 后续代码没有机会执行了,因为程序已经死亡
实例:
如图,第22行代码出来运行时异常,当程序执行第22行代码,出来异常,会产生异常类,
这个异常类会返回给第19行的方法 chu(),然后返回到15行 调用方法的语句,再返回给mian()
最后返回给JVM虚拟机,打印异常栈信息,程序结束