第10章 异常处理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 "

相关文档
最新文档