异常概述、体系
什么是异常?
。异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。
。比如:数组索引越界、空指针异常、日期格式化异常,等…
异常体系:
Error:
- 系统级别问题、VM退出等,代码无法控制。
Exception:
- java.lang包下,称为异常类,它表示程序本身可以处理的问题
- RuntimeException及其子类:运行时异常,编译阶段不会报错。(空指针异常,数组索引越界异常)
- 除RuntimeException.之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。(日期格式化异常)。
常见运行时异常
- 直接继承自RuntimeException.或者其子类,编译阶段不会报错,运行时可能出现的错误。
运行时异常示例
- 数组索引越界异常:ArraylndexOutOfBoundsException
- 空指针异常:NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
- 数学操作异常:ArithmeticException
- 类型转换异常:ClassCastException
- 数字转换异常:NumberFormatException
运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误,
常见编译时异常
异常的默认处理流程
1、默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException.
2、异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给M虚拟机。
3、虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
4、直接从当前执行的异常点干掉当前程序。
5、后续代码没有机会执行了,因为程序已经死亡。
编译时异常的处理机制
编译时异常的处理形式有三种:
- 出现异常直接抛出去给调用者,调用者也继续抛出去。
- 出现异常自己捕获处理,不麻烦别人。
- 前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
异常处理方式1一一throws
- throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
- 这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
异常处理方式2一一try..catch..
- 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
- 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
异常处理方式3一一前两者结合
- 方法直接将异常通过throws抛出去给调用者
- 调用者收到异常后直接捕获处理。
运行时异常的处理机制
- 运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
- 按照规范建议还是处理:建议在最外层调用处集中捕获处理即可。
自定义异常
自定义异常的分类
1、自定义编译时异常
- 定义一个异常类继承Exception.
- 重写构造器。
- 在出现异常的地方用throw new自定义对象抛出,
- 作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!
2、自定义运行时异常
- 定义一个异常类继承RuntimeException.
- 重写构造器。
- 在出现异常的地方用throw new自定义对象抛出!
- 作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!