第10章 异常处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第10章异常处理
10.1 异常处理概述
1、异常
异常是程序运行时产生的错误,由大量例外的,非正常情况下产生的。这些错误有的是致命的,导致程序无法继续运行,而有的错误应该是可以处理的,如用户输入错误、不能打开文件、数组下标越界等。
程序在正常的情况下完成正确的功能,这是最基本的要求,但这还远远不够。在非正常的情况下,程序也应该能产生适当的反应,并继续运行下去,而不是直接终止程序,甚至产生死机等灾难性的后果。好的程序一个非常重要的特点就是鲁棒性,即程序对环境的适应能力,在环境条件出现异常情况下(如用户输入错误,文件被移动、被破坏等),也应有正确合理的表现。
因此我们在程序设计时,应该发现一些会导致运行错误的情形,并进行相应的错误处理,使程序能正常运行下去,而不产生灾难性后果,并导致程序终止。
2、异常示例
查看下面这个程序:输出若干组整数相除的结果。这个程序在编译时没有错误,但在运行时却会产生运行异常。
例10-1 异常示例
class Test{
static void f (int a, int b){
System.out.println(a+"/"+b+"="+a/b);
}
public static void main( String args[ ] ){
f(10, 3);
f(5, 0);
f(3, 2);
}
}
运行结果:
10/3=3
Exception in thread "main" ng.ArithmeticException: / by zero 说明:程序运行时,在执行方法f中的表达式a/b的运算时,若除数b为0时,运算将无法进行,产生运行时异常。我们在main函数中三次调用函数f,其中第二个调用会导致除数为0,运行中产生了异常,程序无法继续运行,系统会非正常的终止程序。当然在这个程序中,除数为0的异常是应该处理,也是可以处理的异常,程序员应该对除数为0的情况给出处理,并使程序能继续运行下去,而不是非正常的终止程序。
3、传统的异常处理方法
传统的异常处理方法是在程序中进行异常条件判断(用if语句),并根据判断结果进行
相应的处理。如:
if(是否异常)
{
}
else
{
}
……
if(是否异常)
{
}
else
{
}
针对上面的程序,采用传统的方法进行异常处理,如程序所示:
例10-2 传统的异常处理方法
class Test{
static void f (int a, int b){
if( b==0)
System.out.println("除数为0");
else
System.out.println(a+"/"+b+"="+a/b);
}
public static void main( String args[ ] ){
f(10, 3);
f(5, 0);
f(3, 2);
}
}
运行结果:
10/3=3
除数为0
3/2=1
程序说明:通过if语句的条件来识别异常情况(即除数是否为0),若异常则输出提示,否则正常执行程序。因此程序在第2次调用f时,会产生提示“除数为0”,程序继续运行。
4、Java异常处理机制
采用传统的方式处理异常,需要对每个可能的异常都使用if…else语句,因此程序结构会被大量if…else语句分割、嵌套,程序中的正常语句和异常处理混合在一起,使程序的结构不够清晰。
Java提供了一套异常处理机制,使程序员能采用不同于传统的方法处理异常。下一节我们讲解Java的异常处理机制。
10.2 Java异常处理机制
异常处理机制也可以看作一种控制结构(类似于选择结构、循环结构),改变程序默认的执行顺序。当异常发生时终止正常的执行顺序,转向异常处理例程。当异常发生时,我们称为抛出异常,当找到并执行与异常匹配的异常处理程序时称为捕获并处理异常。
1、异常处理语句
Java语言的异常处理语句引入了三个关键字:try,catch,finally。语法格式为:
try
{
......//可能会抛出异常的代码
}
catch ( 异常类型异常参数名)
{
......//若抛出ExceptionType1类型的异常时进行的处理
}
catch ( 异常类型异常参数名)
{
......//若抛出ExceptionType2类型的异常时进行的处理
}
......
finally
{
//不论是否捕获异常都要做的处理
}
异常处理语句的具体说明如下:
1)try关键字下跟一对大括号,形成try子语句块,大括号内放置可能会产生异常的一条或多条语句。catch关键字及其后跟的大括号形成catch子语句块,此语句块用来放置异常处理语句。finally关键字对应的子语句块用于放置无论有无异常都会执行的语句,最常见的是一些收尾语句,如释放资源。
2)一个try语句块可以配多个catch子语句块,因为try子语句块内部的语句可能会产生多个不同的异常,而不同的异常其处理方法可能是不同的,需要配置不同的catch子语句块分别进行处理。
3)finally子语句块可以没有,若有只能有一个,且只能放在最后。
4)异常是按类型区分的,某些条件下可能会产生某种特定类型的异常,而catch子语句块后跟的一对小括号,其内为异常处理参数说明,表示此异常处理语句块能处理的异常类型。其格式为:
异常类型异常参数名
正是这里的“异常类型”说明该catch语句块用于处理try语句块中产生的哪种类型的异常。Java的具体的异常类型都是类类型,异常参数名是程序员起的合法的标识符。通过异常参数可以接收抛出的异常的信息。
Java预设的异常处理方式是:若异常发生且没有被处理则终止程序,并输出异常信息。
再看前面的例子,若不进行异常处理,则程序的执行终止,并产生如下输出:Exception in thread "main "