异常
一、异常的种类和层次
(1)Error
从技术上讲,Error 类及其子类对象不是异常,它们代表了程序运行时Java系统内部的错误,与程序设计者的操作无关。Error是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况,程序设计者无能为力,因此不必处理它们。例如,Java 虚拟机运行错误(VirtualMachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机一般会选择线程终止。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
(2)Exception
Exception 通常是由于某个资源不可用,或者正确执行程序所需的条件不满足所造成的,是程序本身可以处理的异常,程序设计者应尽可能加以处理的部分。
Java 将异常类 Exception 分为两类:运行时异常(RuntimeException,也称为未检查异常)和非运行时异常(也称为已检查异常)。运行时异常包含Java. Lang. RunTimeException类以及所有子类,除此之外的属于Exception 类及其子类的所有异常都属于非运行时异常。
运行时异常(RuntimeException 及其子类)和错误(Error)都属于不可查异常,即编译器不要求强制处置的异常,然而对于非运行时异常,编译器会强制要求进行处理。
二、常见的运行时异常
三、异常的捕获与处理
异常处理代码块
完整的异常捕获处理由 try-catch-finally语句实现。
try{
//可能出现异常的代码
}catch(异常类型1变量名1){
//处理异常的方式 1
}catch(异常类型2变量名2){
//处理异常的方式2
}catch(异常类型3变量名3){
//处理异常的方式3
}
...
finally{
//一定会执行的代码
}
try-catch-finally的做法是将程序的业务功能代码放在try语句块中,尝试是否能顺利通过,将异常代码放在catch语句块中,捕获并处理异常,try-catch协同工作,这是Java的异常处理方式。
如图所示,假设执行try语句块抛出异常,程序马上转到匹配成功的catch语句块执行,完成后会去执行finally语句块,结束后再去执行后续代码。假设执行try语句块未抛出任何异常,则程序跳过所有的catch语句块,但是仍然会执行finally语句块,完成后再去执行后续程序。
异常处理解析
(1)try 语句块
①将可能产生异常的代码放在try语句块中尝试执行,异常发生后,try结构内发生异常处之后的代码不会被执行。
②在程序执行过程中,可能会产生并抛出一种或几种异常,这些异常都由它后面的catch负责捕获、处理。
③一个 try 语句块后面可以跟多个catch语句块,从语法的角度也可以一个catch都没有。
④在try结构中声明的变量,在此结构以外就不能再被调用。
**(2)catch语句块 **
①每个 catch 语句块捕获、处理一种类型的异常。当异常发生时,程序会中断正常的流程,离开try语句块去执行相应的catch语句块。
②在catch中声明了异常对象(如ParseExceptione),异常对象封装了异常事件的相关信息,在catch语句块中可以使用这个对象获取这些信息,常用方法包括:
getMessage():返回该异常的详细描述字符串;
printStackTrace():将异常事件的跟踪栈信息输出。建议在捕获到异常时总使用该方法将跟踪栈信息打印输出到控制台。
③编译器禁止定义永远不能到达的catch子句。存在多个catch子句时,必须先捕获子类异常,将异常按照从最具体到最通用的顺序排列。
(3)finally 语句块
①finaly 语句块为可选。一旦有finally语句块,无论try语句块是否抛出异常,finally语句块都要被执行。
②finally 语句块为异常处理提供统一的善后处理,使流程转到其他部分之前,能够对程序的状态进行统一的管理。
③通常在finaly语句块中进行资源释放的工作,如关闭已打开的文件、关闭数据库连接等。