一、异常的概念
异常是指在程序运行中打断正常程序流程的任何不正常的情况,在Java程序中,由于程序员的疏忽和环境因素的变化,会经常出现异常情况。如果不对异常进行处理,就会导致程序的不正常终止。为了保证程序的正常运行,Java专门提供了异常处理机制。
Java中只有Throwable类及其子类的对象才能由异常处理机制进行处理
Java处理的异常可以大致分为3类:Error及其子类、RuntimeException及其它Exception类。Java对于不同的异常类采取不同的处理策略:
- Error及其子类:Error意味着是很难恢复的严重错误,一般不由程序处理
- RuntimeException:意味着程序设计或实现问题,如:数组使用越界、算术运算异常(如除0运算)、空指针异常(即访问没有初始化的空指针),对于这类异常,处理的策略是纠正错误
- 其它Exception类:通常是由环境因素引起的,如:访问的文件不存在、无效URL等,这类异常经常是由用户的误操作引起的,可以在异常处理中处理,例如提示用户进行正确操作
二、异常处理方法
异常处理是指程序获得异常并处理,然后继续程序的执行。为了使程序安全,Java要求如果程序中调用的方法有可能产生某种类型的异常,那么调用该方法的程序必须采取相应动作处理异常。
异常处理具体有如下两种方式:
- 捕获并处理异常
- 将方法中产生的异常抛出
1.捕获并处理异常
(1)try catch finally语句
try catch finally语句可以捕获程序中产生的异常,然后针对不同的异常采用不同的处理程序进行处理。try catch finally语句的基本格式如下:
try{
Java statements //一条或多条可能抛出异常的Java语句
}catch (MyExceptionType e) {
Java statements //当MyExceptionType类型的异常抛出后要执行的代码
}catch (Exception e) {
Java statements //对所有Exception类型的异常(即所有可处理的异常)执行的代码
}finally {
Java statements //执行最终的清理语句
}
try catch finally语句把可能产生异常的语句放入 try{} 语句块中,然后在该语句后紧跟一个或多个 catch 块,每个 catch 块处理一种可能抛出的特定类型的异常。在运行时刻,如果 try{} 语句块中产生的异常与某个 catch 语句处理的异常类型相匹配,则执行该 catch 语句块。finally 语句定义了一个程序块,可放于 try{} 或 catch{} 块之后,该程序有无异常都会执行,一般用于关闭文件或释放其它系统资源。
try catch finally语句中,catch语句可以有一个或多个,finally语句可以省略。但是try语句后至少要有一个catch语句或finally语句。
(2)针对多种异常的通用异常处理
用catch语句进行异常处理时,可以使一个catch块捕获一种特定类型的异常,也可以定义处理多种类型异常的通用catch块。Java中异常类的层次结构示意图如下所示:
Java程序中产生的异常都是Throwable类的对象,具体来说是Throwable或它的子类的实例对象。
如果catch语句块要捕获的异常类是一个中间节点(带有子类的节点),则该异常处理块将可以处理该节点以及其所有子类表示的异常。这样的一个catch语句块就是一个能够处理多种异常的通用异常处理块。
举个小例子:在下面的代码中,catch语句块将处理Exception类及其所有子类类型的异常,即处理程序能够处理的所有类型的异常。
try {
Java statements
} catch (Exception e) {
System.err.println("Exception caught: " + e.getMessage());
}
2.将方法中产生的异常抛出
第二种异常处理的方法是:将方法中可能产生的异常抛出。调用该方法的程序将接收到所抛出的异常。例如下面的这个例子:
public void troublesome() throws IOException{
Java statements
}
如果被抛出的异常在调用程序中未被处理,则该异常将被沿着方法的调用关系继续上抛。直到被处理为止。
如果一个异常返回到了main()方法,并且在main()方法中还没有被处理,那么这个异常将把程序非正常地终止。