




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章包、接口和异常,主要任务介绍Java中包(package)、接口(interface)和异常处理(exception)的使用方法。,1,本章主要内容,1.包2.接口3.异常处理,2,6.1包,Java要求文件名与类名相同,将多个类放在一起时,要保证类名不能重复。当声明的类很多时,类名就有可能冲突,这就需要一种机制来管理类名,这就是包。包是Java提供的一种区别类名空间的机制,是类的组织方式,一个包对应一个文件夹,包中还可以有包,称为包等级。如同文件夹中可以有子文件夹。在源程序中可以声明类所在的包,就像保存文件时要说明文件保存在哪个文件夹中一样。同一个包中类名不能重复,不同包中可以有相同的类名。当源程序中没有声明类所在的包时,Java将类放在默认包中,即运行编译器的当前文件夹中。这时,不能出现重复的类名。,3,6.1.1Java的系统包,Java提供了大量的类,为便于管理和使用,分为不同的包。包又称类库或API包,所谓API(ApplicationProgramInterface)即应用程序接口。API包方面提供丰富的类与方法供大家使用,如画图形、播放声音等,另一方面又负责和系统软硬件打交道,把用户程序的功能圆满实现。所有JavaAPI包都以“java.”开头,以区别用户创建的包。,4,1java.lang包,java.lang包中包含有以下的主要类:数据类型包装类,对应8个基本数据类型,数据类型包装类也有8个:BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short。提供基本数学函数的Math数学类。用于字符串处理的String类和StringBuffer类。System系统类。提供访问系统资源和标准输入输出的方法。Object类。它是Java类层次的根,所有其它的类都是由Object类派生出来的。,5,2java.util包,包含一些低级的实用工具类。这些实用工具类使用方便,而且很重要。主要有:日期Date类、堆栈Stack类、随机数Random类、向量Vector类等。,6,3java.io包,是Java语言的输入输出类库,Java语言的文件操作都是由该类库中的输入输出类来实现的。此外该类库还提供了一些与其它外部设备交换信息的类。java.io包除了包含标准输入、输出类外,还有缓存流、过滤流、管道流和字符串类等。,7,4包,含有访问网上资源的URL类,用于通讯的Sockt类和网络协议子类库等。Java语言是一门适合分布式计算环境的程序设计语言,网络类库正是为此设计的。其核心就是对Internet协议的支持,目前该类库支持多种Internet协议,包括HTTP、Telnet、FTP等等。,8,5java.awt包,提供了创建图形用户界面的全部工具。它包括许多我们熟悉的图形组件(component)类,如窗口、对话框、按钮、复选框、列表、菜单、滚动条和文本区等类;用于管理组件排列的布局管理器Layout类;以及常用的颜色Color类、字体Font类。java.awt.event类库用来处理各种不同类型的事件。,9,6java.applet包,java.applet是所有小应用程序的基础类库。它只包含了一个Applet类,所有小应用程序都是从该类中派生的。,10,7java.security包,包括java.security.acl和erfaces子类库,利用这些类可对Java程序进行加密,设定相应的安全权限等。,11,Java提供的最新内容,如图所示。,12,object类的所有方法和构造方法,如图所示。,13,6.1.2包的引用,1导入包语句在Java程序中是怎样告诉编译器使用哪些包中的类呢?在编写源程序时,如果要使用某个包中的类,要在Java程序的开头添加import语句,指明源程序要使用含有该类的包。如下面的语句:importjava.awt.Graphics;importjava.applet.*;,14,2包的路径,要引入Java包,仅在程序中添加import语句还不够,还要告诉系统,程序运行时到哪里去找Java包。这个功能由环境变量classpath来完成。由于Java使用文件系统来存储包和类,类名就是文件名,包名就是文件夹名,所以进行环境变量的设置就是找到存放包的路径,如“E:j2sdk1.4.2_01lib;”。,15,6.1.3创建自定义包,1自定义包的声明方式要建立自定义包,要使用声明包语句。格式为:声明包语句必须添加在源程序的第一行,表示该文件的全部类都属于这个包。开发人员还可以在不同的文件中使用相同的声明包语句,这样就可将不同文件中的类都包含在相同的包中了,如同将不同的文件放在同一个文件夹中,以后其它类就可以引用这个包中创建好的类了。,16,例6.1在源程序YMD.java中,创建了YMD类,该类具有计算今年的年份,可以输出一个带有年月日的字符串的功能。,packageMypackage;/声明了一个Mypackage包importjava.util.*;/引用java.util包publicclassYMDprivateintyear,month,day;publicstaticvoidmain(Stringarg3),17,publicYMD(inty,intm,intd)year=y;month=(m=1),18,publicstaticintthisyear()returnCalendar.getInstance().get(Calendar.YEAR);/获得当年的年份publicintyear()returnyear;/获得年份publicStringtoString()returnyear+-+month+-+day;/转化为字符串,19,例6.2本程序中,引用了例6.1创建的放入Mypackage包中的YMD类,使用YMD类类中的方法和P3类中的方法,给定某人的出生日期计算出该人年龄,并输出该人姓名,年龄,出生日期。,importMypackage.YMD;/引用Mypackage包中的YMD类publicclassP3privateStringname;privateYMDbirth;publicstaticvoidmain(Stringargs)P3a=newP3(张驰,1990,1,11);a.output();,20,publicP3(Stringn1,YMDd1)name=n1;birth=d1;publicP3(Stringn1,inty,intm,intd)this(n1,newYMD(y,m,d);/初始化变量与对象,21,publicintage()returnYMD.thisyear()-birth.year();/计算年龄publicvoidoutput()System.out.println(姓名:+name);System.out.println(出生日期:+birth.toString();System.out.println(今年年龄:+age();,22,程序运行结果如图所示。,第一个程序声明了自定义包Mypackage,包中存放有YMD类。第二个程序引入了自定义包Mypackage中的类YMD。,23,2设置包的路径,首先在存放源程序的文件夹中使用自定义包名建立一个子文件夹,例如,在“E:java程序”文件夹之中创建一个与包同名的文件夹E:java程序Mypackage,并将编译过的class文件放入该文件夹中。注意:包名与文件夹名大小写要一致。再添加环境变量classpath的路径如下:E:j2sdk1.4.2_01lib;E:java程序,24,3创建包等级,用圆点“.”可以将包名分隔为不同的包等级,即建立不同的文件夹。格式为:如java.awt.image就是一个等级包,反映Java开发系统的层次关系,这个包对应Windows文件系统中的javaawtimage文件夹。如果要修改包名就要修改文件夹名。,25,6.2接口,什么是接口?所谓接口可以看作是没有实现的方法和常量的集合。接口与抽象类相似,接口中的方法只是做了声明,而没有定义任何具体的操作方法。使用接口是为了解决Java语言中不支持多重继承的问题。,26,6.2.1实现系统提供的接口,Java已经创建了许多系统接口,如MouseListener和MouseMotionListener接口,定义了处理鼠标事件的方法,当一个类实现这两个接口后,就可以处理这些鼠标事件。在接口中的方法只有定义没有实现。在接口中定义的变量全部隐含为final和static,表明这些变量不能被实现接口方法的类改变,这些变量还必须设置初值。如果接口为public的,则接口中的方法和变量也全部为public,否则只能被处于同一包中的成员访问。,27,例6.3在类中实现MouseListener和MouseMotionListener两个接口。,importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*;publicclassDrawLextendsAppletimplementsMouseListener,MouseMotionListenerintx1,y1,x2,y2;,28,publicvoidinit()addMouseListener(this);addMouseMotionListener(this);publicvoidpaint(Graphicsg)g.drawL(x1,y1,x2,y2);publicvoidmousePressed(MouseEvente)/记录起点坐标x1=e.getX();y1=e.getY();,29,publicvoidmouseClicked(MouseEvente)publicvoidmouseEntered(MouseEvente)publicvoidmouseExited(MouseEvente)publicvoidmouseReleased(MouseEvente)publicvoidmouseDragged(MouseEvente)/记录终点坐标x2=e.getX();y2=e.getY();repaint();publicvoidmouseMoved(MouseEvente),30,在DrawL类中实现了MouseListener接口中定义的5个方法:,publicvoidmousePressed(MouseEvente)/记录起点坐标x1=e.getX();y1=e.getY();publicvoidmouseClicked(MouseEvente)publicvoidmouseEntered(MouseEvente)publicvoidmouseExited(MouseEvente)publicvoidmouseReleased(MouseEvente),31,实现MouseMotionListener接口的两个方法:,publicvoidmouseDragged(MouseEvente)/记录终点坐标x2=e.getX();y2=e.getY();repaint();publicvoidmouseMoved(MouseEvente),32,6.2.2创建自定义接口,创建自定义接口要使用声明接口语句,格式如下:修饰符/静态常量及方法声明,33,例6.4_1在下面的程序中声明了一个自定义接口Nl。用来计算一个人年龄,interfaceNl/年龄接口intyear=2003;intage();voidoutput();说明:在Nl接口中声明了两个方法:age()和output()以及一个整型常量year。,34,例6.4_2实现接口Nl的例子。,publicclassR1implementsNl/实现年龄接口Stringxm;intcsrq;/类自己的成员变量publicR1(Stringn1,inty)/类构造方法xm=n1;csrq=y;publicintage()/实现接口的方法returnyear-csrq;/这里直接使用了接口的常量year,35,publicvoidoutput()/实现接口的方法System.out.println(this.xm+今年的年龄是+this.age()+岁);publicstaticvoidmain(Stringargs)/类自己的成员方法R1a=newR1(张驰,1990);a.output();,36,程序运行结果如图所示:,37,6.2.3接口的继承关系,1接口的单继承2接口的多重继承,38,例6.5接口的单继承。,interfaceAvoidF1();interfaceBextendsAvoidF2();说明:接口B将继承接口A中的所有变量和方法,这种接口之间的继承称为单继承。接口之间的继承与类的继承一样使用关键字extends。,39,例6.6在类中引用继承的接口的方法。,classMyClassimplementsBvoidF1()voidF2()说明:在这个例子中MyClass实现了接口B,因为接口B继承了接口A,所以接口B实际上还包含了接口A中的方法F1。因此在类MyClass中必须实现接口A中的方法F1和接口B中的方法F2。,40,2接口的多重继承,在Java语言中,不支持类的多重继承。但是支持接口的多重继承,其语法格式如下:interface接口名extends接口名1,接口名2,可见接口的多重继承只是在单继承的基础上再加上几个接口,并把这些接口用逗号分隔开。,41,6.3异常处理,本节介绍Java的异常处理机制。异常是用来处理程序错误的有效机制,以往需要由程序员完成的程序出错情况判别,在Java中改为由系统承担。通过系统抛出的异常,程序可以很容易地捕获并处理发生的异常情况。,42,6.3.1什么是错误与异常,根据错误的性质将运行错误分为两种类型:1致命性错误2异常,43,6.3.2异常发生的原因,异常发生的原因有以下三种:1Java虚拟机检测到了非正常的执行状态2Java程序代码中的throw语句被执行。3异步异常发生。,44,6.3.3异常处理机制,Java提供了异常处理机制来处理异常。分为两个步骤:1抛出异常Java是这样规定的:当语义限制被违反时,将会抛出(throw)异常,即产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常。一个异常对象可以由Java虚拟机来产生,也可以由运行的方法生成。异常对象中包含了异常事件类型、程序运行状态等必要信息。2捕获异常异常抛出后,运行时系统从生成异常对象的代码开始,沿方法的调用栈进行查找,直到找到包含相应处理的方法代码,并把异常对象交给该方法为止,这个过程称为捕获(catch)异常。,45,6.3.4异常对象类型,Java中的异常类具有层次结构组织。如图所示。,46,1.Exception异常类的子类,(1)RuntimeException运行时异常类(2)NoSuchMethodException方法未找到异常(3)java.awt.AWTException图形界面异常类(4)java.io.TOException输入输出异常类(5)Exception异常类的其它子类,47,(1)RuntimeException类主要包括以下异常子类:,ArithmeticException算术异常类:表示遇到了异常的算术问题,例如被0整除。ArrayStoreException数组下标越界异常类:试图把与数组类型不相符的值存人数组。ClassCastException类型强制转换异常类:试图把一个对象的引用强制转换为不合适的类型。IndexOutOfBoundsException下标越界异常类:下标越界。NullPointerException空指针异常类:试图使用一个空的对象引用。SecurityException违背安全原则异常类:检测到了违反安全的行为。,48,java.io.TOException类的子类有:,IOException:申请I/O操作没有正常完成。EOFException:在输入操作正常结束前遇到了文件结束符。FileNotFoundException:在文件系统中,没有找到由文件名字符串指定的文件。,49,Exception异常类的其它子类:,EmptyStackException:试图访问一个空堆栈中的元素。NoSuchFieldException:试图访问一个不存在的域。NoSuchMethodException:试图访问不存在的方法。ClassNotFoundException:具有指定名字的类或接口没有被发现。CloneNotSupportedException:克隆一个没有实现Cloneable接口的类。IllegalAccessException:试图用给出了完整的路径信息的字符串加载一个类。InstantiationException:试图使用Class的newInstance方法创建一个对象实例。InterruptedException:当前的线程正在等待,而另一个线程使用了Thread的interrupt方法中断了当前线程。,50,2Error错误类的子类,(1)VirtualMachineError虚拟机错误OutOfMemoryError内存溢出错误StackOverflowError栈溢出错误(2)LinkageError链接错误NoClassDefNotFoundError类定义未找到错误(3)java.awt.AWTError图形界面错误,51,6.3.5异常的处理,异常处理语句格式为:try/被监视的代码段,一旦发生异常,则交由其后的catch代码段处理catch(异常类型e)/要处理的第一种异常catch(异常类型e)/要处理的第二种异常finally/最终处理,52,例6.7使用trycatch语句处理异常的过程。运行结果如图所示:,53,publicclassTC1publicstaticvoidmain(Stringarg3)System.out.println(这是一个异常处理的例子n);tryinti=10;i/=0;catch(ArithmeticExceptione)System.out.println(异常是:+e.getMessage();finallySystem.out.println(finally语句被执行);,54,例6.8catch语句中声明的异常类型不匹配的情况。,publicclassTC2publicstaticvoidmain(Stringargs)System.out.println(“这是一个异常处理的例子n”);tryinti=10;i/=0;catch(IndexOutOfBoundsExceptione)System.out.println(异常是:+e.getMessage();finallySystem.out.println(finally语句被执行);,55,例6.9多个catch子句的异常处理。运行结果如图所示。,56,publicclassTC3publicstaticvoidmain(Stringargs)tryinta=args.length;System.out.println(na=+a);intb=42/a;intc=1;c42=99;,57,catch(ArithmeticExceptione)System.out.println(发生了被0除:+e);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(数组下标越界:+e);,58,6.3.6throw语句,throw语句格式为:;程序会在throw语句处立即终止,转向trycatch寻找异常处理方法,不再执行throw后面的语句。下面的例子中使用了throw语句主动抛出一个异常。,59,例6.10throw语句的使用,运行结果如图所示。,60,publicclassTC5staticvoidthrowProcess()trythrownewNullPointerException(空指针异常);catch(NullPointerExceptione)System.out.println(n在throwProcess方法中捕获一个+e.getMassage();throwe;,61,publicstaticvoidmain(Stringargs)trythrowProcess();catch(NullPointerExceptione)System.out.println(再次捕获:+e);,62,6.3.7throws子句,throws用来表明一个方法中可能抛出的各种异常,并说明该方法会抛出异常但不捕获的异常。如果想明确抛出一个RuntimeException或自定义异常类,就必须在方法的声明语句中用throws子句来表明它的类型,以便通知调用其它方法准备捕获它,这种情况一般需要两个方法来分别处理抛出异常和处理异常。,63,1抛出异常的方法,在抛出异常的方法中要使用throws子句,throws子句的格式为:,64,2调用方法处理异常,下面的例子声明了mathod方法抛出异常IllegalAccessException,并且不在mathod中捕获它,而在调用mathod的main方法里捕获它。,65,例6.11throws语句的使用,运行结果如图所示。,66,classTC6staticvoidmathod()throwsIllegalAccessExceptionSystem.out.println(n在mathod中抛出一个异常);thrownewIllegalAccessException();publicstaticvoidmain(Stringargs)trymathod();catch(IllegalAccessExceptione)System.out.println(在main中捕获异常:+e);,67,3由方法抛出异常交系统处理,对于程序中需要处理的异常,一般编写try-catch-finally语句捕获并处理;而对于程序中无法处理必须由系统处理的异常,可以使用throws语句在方法中抛出异常交由系统处理。如下面的程序代码,就是将捕获异常交由系统处理。编译将没有问题,但执行程序时,如果该文件在当前目录中不存在,将由系统自动给出异常报告。,68,6.3.8finally语句,当一个异常被抛出时,程序的执行就不再是连续的了,会跳过某些语句,甚至会由于没有与之匹配的catch子句而过早地返回。有时要确保一段代码不管发生什么异常都能被执行是必要的,finally子句就是用来标识这样一段代码的。即使没有catch子句,finally语句块也会在执行了try语句块后立即被执行。每个try语句至少都要有一个与之相配的catch或finally子句。从一个方法返回到调用它的另外一个方法,或者是通过return语句,或者是通过一个没有被捕获的异常,但finally子句总是在返回前执行。,69,例6.12finally子句的使用,运行结果如图所示。,70,classTC7staticvoidmathodA()trySystem.out.println(nmathodA抛出一个异常);thrownewRuntimeException();finallySystem.out.println(执行mathodA的finally);staticvoidmathodB()try,71,System.out.println(mathodB正常返回);return;finallySystem.out.println(执行mathodB的finally);publicstaticvoidmain(Stringargs)trymathodA();catch(Exceptione)mathodB();,72,6.3.9编译时对异常情况的检查,1可检测的异常在编译时,编译器分析哪些方法会产生可检测的异常,然后检查方法中的可检测异常的处理部分。如果方法中没有异常处理部分,就要在方法的throws子句说明该方法会抛出但不捕获的异常,以告知调用它的其它方法,即将异常上交给调用者处理。例如,类Thread的方法sleep定义如下:publicstaticvoidsleep(longmillis)throwsInterruptedException,73,2不可检测的异常(运行时异常类),不可检测的异常类是RuntimeException及其子类、Error及其子类,其它的异常类则是可检测的类。标准JavaAPI定义了许多异常类,既包括可检测的,也包括不可检测的。由程序员定义的异常类也可以包含可检测类和不可检测类。,74,6.3.10创建自己的异常类,自定义异常类型是从Exception类中派生的,所以要使用下面的声明语句来创建:,75,例6.13创建自定义异常。运行结果如图所示。,76,classMyExceptionextendsExceptionprivateintx;MyException(inta)x=a;publicStringtoString()returnMyException;publicclassTC8staticvoidmathod(inta)throwsMyException/声明方法会抛出MyExceptionSystem.out.println(t此处引用mathod(+a+);if(a10)thrownewMyException(a);/主动抛出MyExceptionSystem.out.println(正常返回);,77,publicstaticvoidmain(Stringargs)trySystem.out.println(n进入监控区,执行可能发生异常的程序段);mathod(8);mathod(20);mathod(6);catch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 舅舅房子赡养继承协议书
- 肇庆手提电脑租赁协议书
- 朱砂原材料采购合同范本
- 碧桂园开发的合同协议书
- 网络服务代理合同协议书
- 苏陕两地协作框架协议书
- 肉牛供应买卖合同协议书
- 联合种植香芋协议合同书
- 阁楼钢结构制作合同范本
- 纸箱送货如何写合同协议
- DL∕T 5344-2018 电力光纤通信工程验收规范
- DL∕T 2528-2022 电力储能基本术语
- 山东财经大学《大学英语》2022-2023学年期末试卷
- 2024年歌尔股份有限公司校园招聘考试试题完美版
- peskin量子场论课后答案(芝加哥大学版)
- 医院专家工作站合作协议书
- 2023年河北语文高考试题
- 2023年禁毒工作全年工作总结
- 【精】部编版语文五年级下册第三单元《遨游汉字王国》阅读专项练(含答案)
- 书面检查材料(通用6篇)
- 财税基础 课件全套 高翠莲 项目1-7电子商务企业财税工作认知-电商企业税务报表编制与分析
评论
0/150
提交评论