




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
56Java异常处理和基本可重用类教案 第五章异常处理当程序运行的时候,经常会由于各种不可避免的原因而产生错误。 例如除数为零、文件找不到而无法读写、网点连接不上等。 一个好的程序应该可以自己处理这些错误,而不是使整个程序全部瘫痪。 Java把运行中各种可能出现的错误都看作异常,Java提供的异常情况处理机制叫异常处理。 异常处理把异常集中起来统一处理,程序员只需说明何处可能出现异常,如何处理即可,大大提高了程序的“坚固性”。 5.1异常概述Java中的所有的异常类都是从Throwable类派生出来的。 Throwable类有两个直接子类java.lang.Error和java.lang.Exception。 Throwable ExceptionError IOExceptionRuntimeException Non_RuntimeException不检测异常Error类及其子类描述Java运行时系统内部的错误或资源枯竭导致的错误。 普通的程序不能从这类错误中恢复,这类错误出现的几率很小,不必捕获,是属于未检测的异常。 Exception类和它的子类在编程中错误的处理主要是对这类错误的处理,如除数为零、数组下标越界等。 类Exception是普通程序可以从中恢复的所有规范了的异常的父类。 Exception类又有三个子类IOException某些I/O错误RuntimeException:错误的强制类型转换、数组越界访问、空引用.程序员编写程序不正确所导致的异常Non_RuntimeException:格式不正确的URL、试图为一个不存在的类找到它的类的对象Java提供了两种不同的异常抛出机制throws抛出异常间接抛出异常throw抛出异常直接抛出异常5.2抛出异常与处理异常语句5.2.1throws异常说明throws异常说明总是和方法说明一起出现。 这样,方法说明告诉编译器该方法可能会出现哪些异常,从而要求它的调用者必须考虑处理这些异常。 throws语句的说明形式如下方法说明throws异常类列表【例5-1】本例中方法引用从键盘读一个字符的方法“System.in.read()”产生异常,但是,getChar()可以自己不处理,把异常向调用者传播,由调用者处理,这时可以把该方法说明成抛出异常就行了。 import java.io.*;public classThrowsTestpublic statihar getChar()throws IOException/该方法把异常传给调用者char ch;ch=(char)System.in.read();/引发异常,但没有处理图5-2异常沿着被调用的顺序传播下列情况下Java方法会出现异常 (1)引用的方法抛出异常,如System.in.read()。 (2)检测到错误并使用throw语句抛出异常(见例5-2)。 (3)程序代码有错误,从而抛出异常。 例如数组越界错误。 5.2.2throw异常说明抛出异常(throw)不是系统出错产生,而是人为地抛出。 该异常可以在程序中进行捕获、处理,也可以在调用该方法时捕获、处理。 throw语句的形式如下throw异常类对象【例5-2】以求一元二次方程求根为例,如果x的二次系数a=0,方程不是一元二次方程,抛出异常a为0的异常;如果判别式b2-4*a*c0)x1=(-b+Math.sqrt(b24ac()/(2*a);x2=(-b-Math.sqrt(b24ac()/(2*a);System.out.println(x1=+x1);System.out.println(x2=+x2);elseNoRealRootsException rootsException=new NoRealRootsException(No RealRoots!);throw rootsException;/抛出异常public staticvoid main(String args)throws exceptionQuad q=new Quad(1,2,1);q.x1x2();/定义如下两个异常类,内类ANullException和NoRealRootsException。 class ANullException extends ExceptionANullException(String msg)super(msg);/一元二次方程条件不满足class NoRealRootsException extends ExceptionNoRealRootsException(String msg)super(msg);可以看出,throw抛出异常有如下三个步骤1)确定异常类,本例为NoRealRootsException或ANullException。 2)创建异常类的对象:new NoRealRootsException()或new ANullException()。 3)抛出异常:throw newNoRealRootsException或throw newANullException();在throw异常的方法中,如果自己不处理这种异常,必须在方法定义时说明要抛出(throws)该异常。 如果处理了异常,方法首部是否还要说明,否?例如throws ANullException,NoRealRootsException5.2.3trycatchfinally语句trycatchfinally语句形式如下try语句;/该部位含有抛出异常的语句,或调用抛出异常的方法catch(异常类1对象名)/按抛出的异常对象与异常类1进行匹配,并进入处理catch处理catch(异常类2对象名)/按抛出的异常对象与异常类2进行匹配,匹配才进入处理catch处理finally语句/无论异常有无发生,try或catch后一定要执行的部分解释当catch前面的try块中发生了一个异常,trycatchfinally语句就会自动在try块后面的各个catch块中找出与抛出的异常对象相匹配的类。 当对象符合以下三个条件之一时,就认为这个对象与产生的异常类相匹配。 对象所属类与catch参数类所属类相同。 catch参数类是发生的异常对象的父类。 catch参数类是一个接口时,发生的异常对象类实现了这一接口。 当发生的异常找到了第一个与之相匹配的参数类时,就执行包含这一参数的catch语句代码,执行完catch语句后,程序恢复执行,但不会回到异常发生处继续执行,而是执行trycatch结构后面的代码。 finally语句可以说是为异常处理事件提供的一个清理机制,一般是用来关闭文件或释放其他的系统资源,作为try-catch-finally结构的一部分,如果存在finally语句,不论try块中是否发生了异常,是否执行过catch语句,都要执行finally语句。 trycatchfinally语句执行过程 (1)try块中的语句没有产生异常。 Java首先执行try块中的所有的语句,然后执行finally子句中的代码,最后执行trycatch.finally块后面的语句;(2.1)try块中的语句产生了异常,而且此异常在方法内被捕获。 在这种情况下,Java首先执行try块中的语句,直到产生异常处,然后跳过此try块中剩下的语句,执行捕获此异常的catch子句的处理代码;(2.2)如果此catch子句中没有重新抛出异常,然后执行finally子句中的代码;如果在catch子句又重新抛出了异常,那么Java将这个异常抛出给方法的调用者; (3)try块中产生了异常,而此异常在方法内没有被捕获。 在这种情况下,Java将执行try块中的代码直到产生异常,然后跳过try块中的代码而转去执行finally子句中的代码,最后将异常抛出给方法的调用者。 【例5-3】异常处理机制在编制求一元二次方程根的类Quad中的运用。 下面的类UseQuad引用Quad类,捕获处理Quad类抛出的异常。 public classUseQuadpublic staticvoid main(String args)Quad r1=new Quad(0,2,1);/构造Roots类对象r1try/main()方法捕获、处理异常r1.x1x2();/方法可能抛出异常catch(ANullExceptione)/处理a=0的异常System.out.println(a不可以为0!);catch(NoRealRootsExceptione)/处理无实根异常System.out.println(无实根!);/类体结束5.3综合应用举例*5.3.1人员管理系统进一步讨论例4-23讨论了人员管理,但是它没有提供人员信息录入的功能。 比较例5-4与例4-23,可以看出,人机对话实现人员信息录入,同时正确地利用异常处理机制。 人员管理的任务是人员信息录入、查询、人员信息修改、人员删除、人员统计、人员查询。 这里只实现了人员信息录入、查询,其他功能留给读者练习。 图5-4人员管理系统类图5.3.2单项列表5.3.3InputPerson类InputPerson类(见图5-5),可以从键盘输入姓名、身份证号、性别、住址信息。 要注意的是这个类继承第3章介绍的cha3.ReadData类,它提供了读一个字符、字符串、整数、实型数方法(以换行结束)。 一切异常都由方法抛出,由调用者处理。 5.4程序运行错误的排除及异常主要介绍在Eclipse中,如何利用程序调试工具Debug找出运行错误并排除。 要强调的是这里介绍的程序运行错误的排除及异常处理的调试主要针对类的方法、特别是简单类的主方法。 第6章Java的基本可重用类面向对象技术是提高软件可重用性最有效的途径之一,其中类的引用和类的继承机制为提高程序的可重用性提供了强有力的支持。 Java有一系列功能强大的可重用类,第5章介绍的异常类也是Java可重用类。 程序员在进行Java编程时要首先考虑如何充分利用已有可重用类来构造自己新的类。 因此,了解和掌握Java的可重用类是学习Java程序设计的另一重要方面。 6.1Java可重用类的结构Java可重用类按功能划分为基础包(3种)语言包java.lang(lang意为language)、输入/输出包java.io、实用程序包java.util(util意为utility);应用包(3种)图形用户接口包java.swing、java.awt、小应用程序包java.applet和网络包java.。 Java常用包的简单介绍如下 (1)java.lang包主要含有与语言相关的类。 java.lang包由解释程序自动加载,不需显式说明。 (2)java.io包主要含有与输入/输出相关的类,这些类提供了对不同的输入和输出设备读写数据的支持,这些输入和输出设备包括键盘、显示器、打印机、磁盘文件和网络等。 (3)java.util包包括许多具有特定功能的类,有日期、数学函数、各种对象集合类,如向量、哈希表、列表和堆栈等。 (4)java.swing包和java.awt包提供了创建图形用户界面元素的类。 通过这些元素,编程者可以控制所写Applet或程序的外观界面。 该包中包含定义窗口、对话框、按钮、复选框、列表、菜单、滚动条及文本域的类。 (5)java.包含有与网络操作相关的类,如ServerSocket、Sockets、URL等类。 (6)java.applet包含有控制Hotjava浏览器的类,这些类可以控制HTML文档格式、应用程序中的声音资源等,其中Applet类是用来创建包含于HTML页内的applet必不可少的类。 6.2.Java语言包(java.lang)Java语言的核心部分就是java.lang包,它定义了Java中的大多数基本的类。 每个java类都隐含语句“import java.lang.*;”,由此可见该包的重要性。 java.lang包含以下内容6.2.1Object类;6.2.2包装类Java基本类型boolean、byte、char、int、float、double、long、short和Double对应的包装类(类方法)Boolean、Byte、Character、Integer、Long、Short、Float、Double。 6.2.3字符串类(支持16位Unicode字符)String类支持静态、不变的字符串。 String类提供几种字符串创建方法 (4)String s=Hello!String s=new String(String s)public String(char value)将整个字符数组赋给String构造方法。 public String(char value,int offset,int count)将字符数组一部分赋给String构造方法。 String类提供了丰富的字符串操作方法public Intlength()public charcharAt(int index)public booleanequals(Object o)public StringsubString(int beginIndex,int endIndex)public StaticString valueOf(type variable)public intindexOf(String str)?.StringBuffer类支持可的字符串StringBuffer类提供三种创建方法public StringBuffer()public StringBuffer(int length)public StringBuffer(String str):按str创建一个动态可变的StringBuffer类。 StringBuffer类提供的方法主要用于把输入数据转换为String类。 输入数据可键盘或其它数据源。 类型可以是字符、字符数组、整数、浮点数和Object类型等。 StringBuffer的主要方法public intlength()public intcapacity()返回缓冲区剩余空间。 public synchronizedStringBuffer append(type variable)把variable转换为字符串,然后与当前字符串连接。 public synchronizedStringBuffer append(type variable)把variable转换为字符串,然后与当前字符串连接。 6.4【例题6-1】6.2.4Math类Math提供像PI和E这样的数学常数及各种函数。 1三角函数弧度为单位sin(double a);cos(double a);tan(double a);asin(double r);acos(double r);atan(double r)2乘方 (1)pow(double y,double x)返回y的x次方 (2)exp(double x)返回ex; (3)log(double x)返回x的自然对数; (4)sqrt(doublex)返回x的平方根。 3舍入 (1)ceil(double a)返回大于或等于a的最小整数值; (2)floor(double a)返回小于或等于a的最大整数值; (3)rint(double a)返回舍入尾数后接近a的整型值; (4)round(float a)返回舍入尾数后最接近a的整型值; (5)round(double a)返回舍入尾数后最接近a的长整型值。 4其他 (1)abs(a)返回a的绝对值; (2)max(a,b)返回a和b的最大值; (3)min(a,b)返回a和b的最小值。 Class为运行时搜集的信息,如对instanceof操作符提供支持。 System提供对操作系统的访问,包括默认的I/O流、环境变量、自动垃圾收集、系统时间和系统属性,许多System方法可访问Runtime类的方法。 Runtime提供对操作系统的访问,使用java.lang.Runtime可以使应用程序容易与它所运行的环境协调。 ThreadThread和java.lang.Runnable接口协同作用提供对Java中多线程的支持。 Throwabl它是Java中所有异常(Exception)的父类,是java.lang.Exception java.lang.Error和java.lang.RuntimeException的父类。 应用程序运行发生异常时,这些异常和错误类会作出反映,在第5章已对它们作了介绍。 6.3java.util包java.util包提供了许多实用的类,如日期、各种对象集合类,如数组、矢量、哈希表、链表、树等。 日期时间类是一个相对简单、但使用频繁的类,它提供了独立于具体系统的日期/时间的表示形式。 利用日期时间类提供的方法,可以获取当前日期和时间,创建日期和时间参数,计算某年或某月的天数,或者对当前日期进行比较。 向量类及其使用向量和数组存在许多相似之处,它们均可用以保存列表对象。 数组只能保存固定大小的列表,它必须一次申请所有的存储单元。 如果事先无法确定列表内究竟要存放多少对象,Java的数组就无能为力了,向量数据类型却提供了一种与“动态数组”相近的概念。 哈希表类及其应用Java的哈希表用于存储对象。 Collection API提供了一个广泛的类和接口的集合。 6.4输入输出包java.io6.4.1流(stream)数据源和数据宿的这种多样性,常常造成程序处理输入/输出的复杂性。 另一方面,就程序员而言,不希望将编程的精力过多地消耗在处理输入/输出的具体细节上面,他们希望所有的输入/输出操作都能够有一个相对统一的、简单的操作方式,而不管输入/输出所涉及的数据源和数据宿是怎样的不同和多样。 “流”可以被理解为一条“管道”。 这条“管道”有两个端口一端与数据源(当输入数据时)或数据宿(当输出数据时)相连,另一端与程序相连。 在与数据源或数据宿相连的端口,“管道”在读/写数据时能够应付数据源和数据宿的多样性,消化掉因数据源和数据宿的多样性带来的数据读/写的复杂性;而在与程序相连的端口,“管道”提供了输入/输出的统一操作界面。 由于在程序和数据源/数据宿之间建立了“管道”,使得程序输入/输出时原本直接对数据源和数据宿的繁杂操作转化为对“管道”的统一而简单的操作,这样就大大降低了输入/输出的复杂性,减轻了程序员的负担。 图6-4输入流示意图图6-5输出流示意图6.4.2基本输入输出流输入输出层次中的顶层是类InputStream和OutputStream,它们是抽象类,并且定义了数据流操作的基本方法1InputStream类public abstractint read()throws IOException从流中读取一个字节数据。 public longskip(long n)throws IOException跳过流中的指定字节数。 public intavailable()throws IOException返回当前流中可用的字节数。 public voidclose()throws IOException关闭当前流对象。 2OutputStream类public abstractvoid write(int b)throws IOException向流中写一个字节。 public voidflush()throws IOException清空流并强制将缓冲区中的所有数据写入到流中。 public voidclose()throws IOException关闭流对象。 3System.in和System.out对象例6-3Java定义了两个流的对象System.in和System.out,System.in可以从键盘中读入数据,System.out可以将数据输出到显示屏。 System.in使用不方便,所以用第3章介绍的ReadData类,它利用InputStreamReader和BufferedReader类使System.in对流可以读一行,以前示例利用ReadData输入一个数据项,这里的类ReadRecotd继承ReadData,输入一行记录,它包含多个数据项,需要将一行记录分解成数据项。 例如Person构建对象时,从键盘一行读入Person对象的所有基本属性(name;idNo;sex;),即一个记录。 又如Adresss一个记录包括state;city;street;no;各数据项用“;”分隔,每个记录一行,用回车分隔。 6.4.3File类文件是存储在辅助存储器中的一组相关信息的集合,它可以存放程序、文档、图片、声音或视频信息等。 为了便于对文件管理,系统允许用户给文件设置或取消有关的文件属性,如只读属性、隐藏属性、存档属性、系统属性。 目录是一种特殊的文件,用以存放普通文件或其他的目录的属性。 磁盘格式化时,系统自动地为其创建一个目录(称为根目录)。 用户可以根据需要在根目录中创建低一级的目录(称为子目录),子目录中还可以再创建下一级的子目录,从而形成树型目录结构,目录也可以设置相应的属性。 路径(path)是从盘符经过各级子目录到文件的目录序列。 由于文件可以在不同的磁盘、不同的目录中,所以在存取文件时,必须指定文件的存放位置。 文件的存放位置通过路径来描述,路径的表示格式为盘符:目录名文件名,比如在C盘根目录下的子目录window下子目录java中的文件myfile.java,应表示为C:windowjavamyfile.java6.4.4文本文件读写6.4.5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培养孩子逻辑思维习惯
- 八百壮士活动策划方案
- 公交公司安全活动方案
- 公交志愿活动方案
- 森林运动会大结局650字12篇范文
- 公共图书馆活动方案
- 一年级写人作文我喜欢的老师200字8篇
- 告示引起的刺杀2000字10篇范文
- 公司diy美食活动方案
- 小区智能门禁系统合作协议
- 与总包等的协调配合措施
- 新世纪健康饮食课件
- 在深化纠正“四风”和提高工作效率专题研讨会上的发言
- 上海市2013年基准地价更新成果
- 道德与法治四年级(下)第二单元单元备课
- 小学音乐 花城版 二年级《稻草里的火鸡》课件
- 物质安全数据表(MSDS)84消毒液
- 苏州市吴江区2021-2022苏教版五年级数学下册期末试卷真题
- “363生态课堂”模式及流程
- (高清版)建筑工程风洞试验方法标准JGJ_T 338-2014
- 钢构车棚施工组织方案
评论
0/150
提交评论