什么是异常
异常本质上是程序的错误,错误在我们编写程序的过程中经常发生,包括编译期间和运行期间的错误,编译期间错误编译器会给出提示,运行期间错误编译器不会提示,往往难以所料。
异常的分类
- Java中通过 Throwable 及其相关子类对异常进行描述
- Error 是程序无法处理的错误,表示运行应用程序中较严重的问题,这类错误是不可查的,不需要处理它所引起的异常
- Exception 是程序本身可以处理的异常。异常处理通常指的是对这种类型或其子类进行处理
- Unchecked Exception (非检查异常) 编译器不要求强制处置的异常,RuntimeException 子类就是非检查异常
- Checked Exception (检查异常) 编译器要求必须处置的异常,除了 RuntimeException 的子类,基本都是检查异常
异常处理机制
异常处理机制为:先抛出异常,后捕获异常
- 抛出异常:当一个方法中出现错误引发的异常时,方法会创建异常对象并交付给运行时系统进行处理,异常对象通常包含异常类型及异常出现时的程序状态等
- 捕获异常:运行时系统捕获到异常后,会去寻找合适的处理器,如果找到与之匹配的处理器就会执行相关的处理逻辑,如果始终没找到,运行时系统将会终止,即Java程序终止运行
- Java规定:对于可查异常必须捕获,或者声明抛出;允许忽略不可查的RuntimeException和Error
三种异常处理方式
try-catch-finally用于捕获异常
- try块负责抛出异常,catch块负责捕获异常,finally块无论如何都会执行
- try块后可跟一个或多个catch块,如果没有catch块,则必须跟一个finally块
- 应用多重catch进行异常捕获时,需要注意范围,即大范围(父类)后置,建议在catch块最后加一个父类异常Exception用于捕获意料之外的异常
- e.printStackTrace(); 可以打印出错误的堆栈信息,包括错误的描述、错误的类型、错误出现的位置,但输出位置是随机的
- return不能打断finally块的执行,所以不建议在finally中写return语句
- System.exit(1); 终止当前正在运行的Java虚拟机,且不会执行finally块中代码
throws声明可能要抛出的异常
- 如果一个方法可能会出现异常,但却没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常,谁调用这个方法,谁就来处理它
- throws后可跟单个或多个异常类型,不可跟异常对象
throw手动抛出异常,例如:throw new Exception(“我是一个异常”);
- 通过try-catch包含throw语句,自己抛出自己处理