第07章JAVA语言中的异常教学课件

上传人:痛*** 文档编号:241638563 上传时间:2024-07-12 格式:PPT 页数:34 大小:364.50KB
返回 下载 相关 举报
第07章JAVA语言中的异常教学课件_第1页
第1页 / 共34页
第07章JAVA语言中的异常教学课件_第2页
第2页 / 共34页
第07章JAVA语言中的异常教学课件_第3页
第3页 / 共34页
点击查看更多>>
资源描述
异常异常 编写程序时多多少少总会有些错误,程序中的语法错误会在编译时被发现并修正,而有些错误是发生在运行阶段的。这些错误依照其严重程度分为两类,一类是致命性的严重错误,它们的出现可能会导致系统崩溃,并且程序员并不能编写程序解决所出现的问题。另一类是普通级别的错误,这类错误如果不加控制就使程序非正常中断,但如果编写代码来处理的话,就有可能避免中断程序的执行。这类错误一般地称为异常(Exception),用来处理异常的过程称为异常处理。异常异常在Java中主要有三类异常。事实上,Java定义了类java.lang.Throwable,它是使用异常处理机制可被抛出并捕获的所有异常对象的父类。它有三个基本子类,如下图:异常异常每个类的使用目的不同。Error表示很难恢复的错误。一般不期望用户程序来处理,即使程序员有能力处理这种错误,也还是交给系统处理为好。RuntimeException用来表示设计或实现方面的问题。因为设计和实现正确的程序不会引发这类异常,所以常常不处理它。发生这类异常时,运行时环境会输出一条信息,提示用户修正错误。其他异常表示运行时因环境的影响可能发生并可被处理的问题。因为用户的错误很可能导致这类问题发生,我们要学习的是如何处理这类异常。异常示例异常示例 例7-1 文件操作功能描述 openTheFile;/打开文件 determine its size;/获取文件的长度 allocate that much memory;/分配内存 read-file;/读文件 closeTheFile;/关闭文件 实现文件读取的程序大多有上述这样的程序框架。因为文件存放在外存,程序要访问文件时必须先要将文件放入内存然后才能访问。这段程序是顺序执行结构,而前一句执行的结果又直接影响后一句是否能执行。如果中间哪一条语句执行不正确,后续语句都不能正确执行,程序也会中断。所以凡是有输入输出操作的语句都可能会出现问题。异常示例异常示例例7-2 增加了约束的文件操作功能描述openFiles;/打开文件 if(theFilesOpen)/判定打开是否正确 determine the length of the file;/获取文件的长度 if(gotTheFileLength)/判定已得到文件长度 allocate that much memory;/分配内存 if(gotEnoughMemory)/内存分配成功 read the file into memory;/读文件 if(readFailed)errorCode=-1;/读取失败 else errorCode=-2;/读取成功 closeTheFile;/关闭文件 else errorCode=-3;/内存分配不成功 else errorCode=-4;/没有得到文件长度 else errorCode=-5;/文件打开不正确异常异常 程序发生异常时称为产生了一个异常事件,系统根据异常生成一个异常对象。根据这个异常的种类,该对象可能由正在运行的方法生成,也可能由JVM生成。异常对象中包含了该异常必要的详细说明信息,包括所发生的异常事件的类型及异常发生时程序的运行状态。生成的异常对象传递给Java运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的这一过程称为抛出(throw)一个异常。异常异常异常发生后,Java运行时系统从生成对象的代码块开始进行回溯,沿方法的调用栈逐层回溯寻找处理代码,并把异常对象交给该方法处理,这一过程称为捕获(catch)。如图所示:异常处理方式示例异常处理方式示例下面用异常处理方式重写例7-2。try openTheFile;/打开文件 determine its size;/获取文件的长度 allocate that much memory;/分配内存 read-File;/读文件 closeTheFile;/关闭文件 catch(fileopenFailed)/文件打开失败的处理代码;catch(sizeDetermineFailed)/不能获得文件大小的处理代码;catch(memoryAllocateFailed)/内存分配失败的处理代码;catch(readFailed)/读文件失败的处理代码;catch(fileCloseFailed)/关闭文件失败的处理代码;finally/需要统一处理的代码;异常类和错误类异常类和错误类Java语言在所有的预设包中都定义了异常类Exception和错误类Error。Exception类是所有异常的父类,Error类是所有错误的父类,这两个类同时又是Throwable的子类。它们的层次结构如图所示:异常处理相关语句异常处理相关语句 虽然引发某个具体异常的语句可能是一条,但相关的语句可能会有多条,程序中使用try语句将这些语句全部括住。在try语句后面是一组catch语句,对所括住的语句可能引发的异常进行分类,对每一种类型的异常提供一段相应的处理代码,每种异常对应一个catch语句。try与与catch语句语句 try与catch语句的语法格式如下:try /此处为抛出具体异常的代码 catch(ExceptionType1 e)/抛出ExceptionType1异常时要执行的代码 catch(ExceptionType2 e)/抛出ExceptionType2异常时要执行的代码 .catch(ExceptionTypek e)/抛出ExceptionTypek异常时要执行的代码 finally /必须执行的代码 其中,ExceptionType1,ExceptionType2,ExceptionTypek是产生的异常类型。根据发生异常所属的类,找到对应的catch语句,然后执行后面的语句序列。Finally语句语句异常处理中有一个特殊的语句,即finally语句。它是最后一条语句,Java规定,不论是否捕获到异常,总要执行finally后面的语句。即使try块中包含return、break、continue、throw等语句,finally语句也会被执行。finally语句不执行的情况只有一种,即在保护代码内执行了System.exit()方法后,将不再执行finally后面的语句,这是不执行finally后面语句的惟一一种可能。公共处理示例公共处理示例例7-4 公共处理示例 try openfile();/打开文件 read_file();/读文件 finally closefile();/关闭文件 因为closefile()方法放到了finally块中,所以总被执行。公共处理示例公共处理示例再看下面的例子。程序7-3总会输出“finally”,而“aftertry”仅在aVar的值不等于10时才被输出。程序7-3 公共处理的完整代码 public class tryAgain public static void main(String args)int aVar=0;try if(aVar=10)return;finally System.out.println(finally);System.out.println(aftertry);公共异常公共异常(1)ArithmeticException异常。进行表达式计算时,除数不能为零。当程序中出现除数为零,或在整数运算中对零取模时,就会发生该类异常。如下面表达式将引发ArithmeticException异常:int i=12/0;/除数为0 float avar=12%0;/对0取模公共异常公共异常(2)ArrayIndexOutOfBoundsException异常。这是数组下标越界异常。数组元素的个数在数组初始化时已经确定下来,程序中访问数组元素时,不能超过数组的长度。系统根据length值来检查数组下标表达式,如果超出这个值,则将导致该异常。见下例。例7-5 数组下标越界 class ArrayOut public static void main(String args)int aArray=new int3;aArray3=0;/数组下标只能是0、1、2 公共异常公共异常(3)IncompatibleClassChangeException异常。这是类不兼容异常。当修改一个类的定义后,引用该类的其它类没有重新编译,就会产生该异常。对应的情况有以下两类:一个类中的变量声明由静态变成非静态,或由非静态变成静态,而其它访问该类这一变量的类没有被重新编译。类中声明的某个域或是某个方法被删除,而其它访问该域或该方法的类没有被重新编译。(4)IncompatibleTypeException异常。这是类型不兼容异常。名字虽然与前一个异常很类似,但含义不相同。如果试图定义一个接口的实例,则会引发IncompatibleTypeException异常。公共异常公共异常(5)NegativeArraySizeException异常。这是数组元素个数为负异常。数组长度应该是一个大于等于0的整数,所以定义数组时,方括号中的数不能写负数。当然,如果定义一个元素个数为零的数组是没有使用价值的,所以也应该避免。创建数组时,如果指定的元素个数是个负数,则会引发该异常。例7-6 引发数组元素个数为负异常示例 class NegArray public static void main(String args)int aVar=new int-1;/数组元素个数不能是负数 aVar0=0;公共异常公共异常(6)NoClassDefFoundException异常。这是类未定义异常。如果一个类被引用,但在运行时,系统没有找到被引用的类,就会引发该异常。例如,声明一个NoClass类,其中用到了另一个类anotherClass,但系统找不到这个类,引发类未定义异常。例7-7 类未定义异常示例 class NoClass public static void main(String args)anotherClass aCVar=new anotherClass();公共异常公共异常(7)NullPointerException异常。这是空指针异常。如果一个对象的值是null,而程序试图访问它的变量或方法,或者访问一个空数组中的元素时,都将导致该异常。看下面的例子。例7-8 引发空指针异常示例 class NullObject public static void main(String args)String oString=null;/空串 int aArray=null;/空数组 oString.length();/不能访问空串的方法 aArray0=0;/不能访问空数组的元素 程序中创建了两个对象,分别是空字符串和没有初始化的数组。对它们的访问都会导致空指针异常。公共异常公共异常(8)OutOfMemoryException异常。这是内存溢出异常。当系统无法再向应用程序提供内存时,会引发该异常。这种异常只能出现在创建新对象的时候,即new被调用的时候。例7-9 引发内存溢出异常示例 class Link int a=new int1000000;Link l;class NullObject public static void main(String args)Link root=new Link();Link cur=root;while(true)/死循环 cur.l=new Link();/总在申请内存 cur=cur.l;公共异常公共异常(9)SecurityException异常。这是安全方面的异常,一般在浏览器内抛出。若Java小程序试图进行不安全的操作时,则由SecurityManager类抛出此异常。除此之外,还有下列常见异常:(10)ArrayStoreException(数组存取异常)程序试图存取数组中错误的数据类型。(11)FileNotFoundException(文件不存在异常)试图存取一个并不存在的文件。(12)IOException(I/O异常)通常的I/O错误。抛出语句抛出语句 程序员处理异常有两种方法。一是在异常发生的位置处立即处理,即使用try语句将可能出现异常的语句块括住并预先估计可能会发生的异常类,紧接其后使用catch语句对这些异常类进行相应的处理。另一种方法是,程序员不在发生异常的当前方法内处理异常,而是把异常抛出到调用方法中。抛出的语句格式如下:访问权限修饰符 返回值类型 方法名(参数列表)throws 异常列表紧接在关键字throws后面的是该方法内可能发生且不进行处理的所有异常列表。抛出的异常可以有多个,各异常之间以逗号分隔。父类子类异常处理示例父类子类异常处理示例例7-10 父类子类异常处理示例 import java.io.*;class Base/父类 public static void amethod()throws FileNotFoundException public class ExcepDemo extends Base/子类 /抛出的异常不同于父类同名方法抛出的异常,也不是它的子类 /编译出错 public static void amethod()throws IOException 因为在父类中抛出的异常是FileNotFoundException,它是IOException异常的子类,所以上面的代码不能被编译。如果互换例7-10中抛出的两个异常,即在父类中抛出IOException异常,在子类中的方法抛出FileNotFoundException,此时代码正确。捕获的错误示例捕获的错误示例捕获多个异常时,异常类的派生关系也需要注意。应该先捕获特殊的异常,即异常子类,然后才能捕获更一般的异常,即异常父类。下面的代码是错误的:try DataInputStream dis=new DataInputStream(System.in);dis.read();catch(Exception ioe)/一般异常 catch(IOException e)/编译错误!finally捕获异常捕获异常程序中,有些语句必须要捕获异常,而有些由系统自动完成。I/O操作必须捕获异常,遍历数组元素时不需要由程序员控制,系统自动对数组做检查。另外,捕获异常的语句一般出现在可能发生异常的代码段,而不应该放到控制程序执行的语句段。捕获异常捕获异常程序7-6 I/O操作必须捕获异常 import java.io.*;public class FileOut public static void main(String args)try FileReader fr=new FileReader(FileOut.java);catch(Exception e)System.out.println(e.getMessage();在当前目录下查找文件FileOut.java,如果找不到,则显示一条错误信息。创建自己的异常创建自己的异常 系统虽然已经定义了公共异常类,但这些往往还不能满足实际需要。编制程序中,除了使用系统预定义的异常外,用户还可以创建自己的异常。自己定义异常类时,必须从已有的异常类来继承,所以用户自定义的所有异常类都必须间接或直接的是Exception的子类。创建异常示例创建异常示例程序7-7定义自己的异常 class MyException extends Exception private int detail;MyException(int aExcep)detail=aExcep;public String toString()return MyException+detail+;class ExceptionDemo static void compute(int aExcep)throws MyException System.out.println(Called compute(+aExcep+.);if(aExcep 10)throw new MyException(aExcep);System.out.println(Normal exit);public static void main(String args)try compute(1);compute(20);catch(MyException eExcep)System.out.println(Exception caught+eExcep);自定义异常示例自定义异常示例客户端程序尝试与服务器连接,并期待服务器在5秒内作出响应。如果服务器没有响应,则客户端抛出一个异常。程序中定义新的异常类,并在这个异常类中显示相关信息。例7-12 自定义异常 public void connectMe(String servename)throws ServerTimedOutException int success;int portToConnect=80;/端口号 success=open(serveName,portToConnect);if(success=-1)throw new ServerTimedOutException();自定义异常示例自定义异常示例使用try语句可捕获该异常:public void findServer().try connectMe(defaultServer);catch(ServerTimedOutException e)g.drawString(Server timed out,trying alternate,5,5);try connectMe(alternateServer);catch(ServerTimedOutException e1)g.drawString(No server currently available,5,5);.JAVA程序设计程序设计人民邮电出版社人民邮电出版社谢谢!谢谢!3334
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!