欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    java继承、接口与泛型.ppt

    • 资源ID:5579828       资源大小:380.01KB        全文页数:96页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    java继承、接口与泛型.ppt

    第5章 继承、接口与泛型,1.子类与父类的定义2.子类的继承权限3.子类对象的构造过程4.复用和多态性5.抽象类、接口6 内部类和匿名类,5.1 子类与父类,父类可以是自己编写的类也可以是java类库中的类。利用继承有利于实现代码的重复使用,子类只需要添加新的功能代码即可。Java不支持多重继承,即子类只能有一个父类。使用关键字extends来声明一个类是另外一个类的子类,格式如下:class 子类名 extends 父类名.,返回,5.2 子类的继承性,5.3 子类对象的构造过程,1)父类和子类的构造方法哪个先执行?2)父类多个的构造函数中那个被执行?2)如何指定执行父类某个特定的构造函数?3)子类可以访问父类的私有成员吗?,5.3 子类对象的构造过程,子类对象内存示意图如下图,5.4 成员变量的隐藏和方法的重写,1成员变量的隐藏(覆盖)class A private int x=10;void h()System.out.println(x=+x);class B extends A private double x=1.1;void g()float z=x+100;System.out.printf(z=%fn,z);,public class Example4 public static void main(String args)B b=new B();b.g();/调用子类自己声明的方法。b.h();,5.4 成员变量的隐藏和方法的重写,2方法重写 1)子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。2)子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。3)如果子类还想使用被隐藏的方法,必须使用关键字super。,5.4 成员变量的隐藏和方法的重写,3访问修饰符protected的进一步说明(a)子类D的protected成员变量和方法,如果不是从父类继承来的,object访问这些protected成员变量和方法时,只要E类和D类在同一个包中就可以了。(b)如果子类D的对象的protected成员变量或protected方法是从父类继承的,那么就要一直追溯到该protected成员变量或方法的“祖先”类,即A类,如果E类和A类在同一个包中,object对象能访问继承的protected变量和protected方法。,返回,5.5 Super 关键字,Super关键字有两种用法:一种用法是子类使用super调用父类的构造方法另一种用法是子类使用super调用被子类隐藏的成员变量和方法。,5.6 final 类和final方法,final类不能被继承,即不能有子类,如:final class A 将一个类声明为final类一般是由于安全性考虑。因为一旦一个方法被修饰为final方法,则这个方法不能被重写,即不允许子类通过重写隐藏继承的final方法。,返回,5.7对象的上转型对象,那么就称对象a是子类对象b的上转型对象,对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。上转型对象具有如下特点(见下图所示)。,5.7对象的上转型对象,(1)上转型对象不能操作子类声明定义的成员变量;也不能使用子类声明定义的方法。(2)上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以使用子类继承的或重写的方法。(3)上转型对象不能操作子类新增的方法和成员变量(4)可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能,5.8 继承与多态,当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转型对象在调用这个方法时就可能具有多种形态。,5.9 使用abstract 类,用关键字abstract修饰类称为abstract类(抽象类)。如:abstract class A 1)abstract类不能用new运算符创建对象,必须产生其子类,由子类创建对象。2)若abstract类的类体中有abstract方法,只允许声明,而不允许实现,而该类的子类必须实现abstract方法,即重写父类的abstract方法。3)一个abstract类只关心子类是否具有某种功能,5.9 使用abstract类,现在让我们来分析一下上面的例子,在这个例子中,我们用到了abstract类和对象的上转型对象。我们可以看到我们在一个方法就构造了一个即包含圆锥又包含以梯形为底的锥(Cone(Geometry bottom,double height),若我们不用abstract类和对象的上转型对象,这里我们至少要使用两个构造方法。这里是只涉及圆锥和梯形锥,若是在有其它很多种形式的锥,这里的工作的量将非常大,这就是我们为什么使用abstract类和对象的上转型对象。当然当我们学习接口后我们还可以使用接口实现这种功能。这在后面将详细介绍。,返回,5.10 接口,Java不支持多继承性,为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。1接口的声明与使用(1)接口声明我们曾使用关键字class来声明类,接口通过使用关键字interface来声明,格式:interface 接口的名字,5.10 接口,(2)接口体 接口体中包含常量定义和方法定义两部分。接口体中只进行方法的声明,不许提供方法的实现,所以,方法的定义没有方法体,且用分号“;”结尾。(3)接口的使用 一个类通过使用关键字implements 声明自己实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,如:class A implements Printable,Addable,5.10 接口,1)如果一个类实现某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。2)接口中的方法被默认是public和abstract的,接口在声明方法时可以省略方法前面的public和abstract关键字,但是,类在实现接口方法时,一定要用public来修饰。3)接口中的变量默认是static和final的(可以用来代替C中的枚举)4)接口也可以继承,5.10 接口,接口的思想在于它可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系,就象各式各样的商品,它们可能隶属不同的公司,工商部门要求都必须具有显示商标的功能(实现同一接口),但商标的具体制作由各个公司自己去实现。,返回,5.11 接口的回调,1接口回调 接口回调是多态的另一种体现接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称作对象功能的接口回调。,5.11 接口的回调,不同的类在使用同一接口时,可能具有不同的功能体现,即接口的方法体不必相同,因此,接口回调可能产生不同的行为。下面我们看看使用了接口的回调技术的例子。2接口做参数,返回,5.12 内部类,我们已经知道:类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类。Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。内部类同类中声明的方法或成员变量一样,一个类把内部类看作是自己的成员。外嵌类的成员变量在内部类中仍然有效内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌类可以用内部类声明对象,作为外嵌类的成员。,返回,23,例题1(内部类可以作为外包类的一个成员使用,可以访问外包类的所有成员)public class Outer1 private int size;/*Declare an inner class called Inner*/public class Inner public void doStuff()/The inner class has access to size from Outersize+;public void testTheInner()Inner i=new Inner();i.doStuff();,24,例题2:public class Outer3 private int size;public class Inner private int size;public void doStuff(int size)size+;/the local parameter this.size+;/the Inner object attribute Outer3.this.size+;/the Outer3 object attribute,5.13 匿名类,1和类有关的匿名类 当使用类创建对象时,程序允许我们把类体与对象的创建组合在一起,也就是说,类创建对象时,除了构造方法还有类体,此类体被认为是该类的一个子类去掉类声明后的类体,称作匿名类。匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创建一个对象。假设Hello是类,那么下列代码就是用Hello的一个子类(匿名类)创建对象:,5.13 匿名类,new Hello()匿名类的类体 匿名类可以继承类的方法也可以重写类的方法。我们使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类,匿名类可以访问外嵌类中的成员变量和方法,匿名类不可以声明static成员变量和static方法。匿名类的主要用途就是向方法的参数传值。,5.13 匿名类,2和接口有关的匿名类 假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。下列代码就是用实现了Computable接口的类(匿名类)创建对象:new Computable()实现接口的匿名类的类体,5.13 匿名类,如果某个方法的参数是接口类型,那么我们可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要实现接口中的全部方法。,返回,5.14 异常类,所谓异常就是程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误作出处理。这一章将对异常给出初步的介绍,而Java程序中出现的具体异常问题在相应的章节中还将讲述。当程序运行出现异常时,Java运行环境就用异常类Exception的相应子类创建一个异常对象,并等待处理 ava 使用trycatch语句来处理异常,将可能出现的异常操作放在trycatch语句的try部分,当try部分中的某个语句发生异常后,try部分将立刻结束执行,而转向执行相应的catch部分;,5.14 异常类,所以程序可以将发生异常后的处理放在 catch部分。1trycatch语句trycatch语句的格式如下:try 包含可能发生异常的语句 catch(ExceptionSubClass1 e),5.14 异常类,catch(ExceptionSubClass2 e)各个catch参数中的异常类都是Exception的某个子类,表明 try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。,5.14 异常类,2自定义异常类 我们也可以扩展Exception类定义自己的异常类,然后规定哪些方法产生这样的异常。一个方法在声明时可以使用throws关键字声明抛出所要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,这将导致该方法结束执行并抛出所创建的异常对 象。程序必须在trycatch块语句中调用抛出异常的方法。,5.15 泛型类,泛型(Generics)是Sun公司在SDK1.5中推出的,其主要目的是可以建立具有类型安全的集合框架,如链表、散列映射等数据结构,关于这一点我们将在第7章的4-9节分别讨论。1泛型类声明 可以使用“class 名称”声明一个类,为了和普通的类有所区别,这样声明的类称作泛型类,如:class A 其中A是泛型类的名称,E是其中的泛型,也就是说我们并没有指定E是何种类型的数据,它可以是任何对象或,5.15 泛型类,接口,但不能是基本类型数据。泛型类的类体和和普通类的类体完全类似,由成员变量和方法构成,如:class Chorus void makeChorus(E person,F yueqi)person.toString();yueqi.toString();,5.15 泛型类,2使用泛型类声明对象 使用泛型类声明对象时,必须要指定类中使用的泛型的具体实际类型。例如:Chorus model model=new Chorus();,5.15 泛型类,Java中的泛型类和C+的类模板有很大的不同,在上述例子中,泛型类中的泛型数据person和yueqi只能调用Object类中的方法,因此“学生类”和“乐器类”都重写了Object类的toString()方法。,5.15 泛型类,3泛型接口 可以使用“interface 名称”声明一个接口,这样声名的接口称作泛型接口如 interface Computer,5.15 泛型类,Java泛型的主要目的是可以建立具有类型安全的数据结构,如链表、散列表等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。SDK1.5是支持泛型的编译器,它将运行时类型检查提前到编译时执行,使代码更安全。,返回,作业:使用抽象类或接口完成以下程序,并说明与不使用抽象类有何不同,1.编写一个控制台程序,完成1)首先提示用户选择输入数据类型 c表示字符,s表示字符串,i表示整数,r表示浮点数2)用户输入选择后,提示用户输入待排序数据,每次输入以回车结束,并提示用户再次输入3)最后一次用户直接回车表示用户输入结束4)对用户输入的数据从大到小排序,并友好的显示排序结果,【问题描述】设停车场是一个可停放n辆汽车的 长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。,【基本要求】以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出 汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。【测试数据】设n=2,输入数据为:(A,1,5),(A,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。,补充知识,1.abstract和final关键字2.this和super关键字3.异常处理 try catch except finally throws,异常(Exception)处理,1、异常的概念2、异常的分类(Throwable/Exception)3、捕获异常(try-catch-finally)4、声明异常(throws)5、抛出异常(throw)6、创建自己的异常,1、异常的概念,在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的鲁棒性(强壮性,robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。,1、异常的概念,在C语言中,通过使用if语句来判断是否出现了错误,同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的错误事件并进行处理。但是,这种错误处理机制会导致不少问题,因为在很多情况下需要知道错误产生的内部细节。通常,用全局变量Errno来存储一个异常事件的类型,这容易导致误用,因为一个Errno的值有可能在被处理前被另外的错误覆盖掉。此外,即使最优美的C语言程序,为了处理异常情况,也常常求助于goto语句。,没有错误处理的程序:FILE f=openTheFile(“c:a.xml”);int len=getFilesize(f);char c=allocatememory(len);c=readfile(f);closeFile(f);,1、异常的概念,1、异常的概念,以常规方法处理错误: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;else errorCode=-3;else errorCode=-4;else errorCode=-5;,以常规方法处理错误存在的问题:观察前面的程序,大家会发现大部分精力花在出错处理上了 只把能够想到的错误考虑到,对以外的情况无法处理 程序可读性差,大量的错误处理代码混杂在程序中 出错返回信息量太少,无法更确切的了解错误状况或原因,1、异常的概念,1、异常的概念,Java通过面向对象的方法来处理程序错误,在Java中,错误被称为例外或异常(Exception)。在一个方法的运行过程中,如果发生了例外,则这个方法(或者是Java虚拟机)生成一个代表该例外的对象(包含了该例外的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为抛弃(throw)一个例外。运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。,1、异常的概念,用异常的形式处理错误:try openTheFile;determine its size;allocate that much memory;read-File;closeTheFile;catch(fileopenFailed)dosomething;catch(sizeDetermineFailed)dosomething;catch(memoryAllocateFailed)dosomething;catch(readFailed)dosomething;catch(fileCloseFailed)dosomething;finally dosomething;,1、异常的概念,例外机制的优点:把错误处理代码从常规代码中分离出来按错误类型和差别分组(类Exception,派生)对无法预测的错误的捕获和处理(基类)克服了传统方法的错误信息有限的问题(getMessage)把错误传播给调用堆栈(比较:全局变量,返回值),1、例外的概念,什么情况下使用例外机制?当方法因为自身无法控制的原因而不能完成其任务文件不存在,网络连接无法建立处理在方法、类库、类中抛出的例外如FileInputStream.read产生IOException在大的项目中采用统一的方式处理错误时如编写一个文字处理器例外应该是不经常发生但却可能发生的故障一定发生的事件不应该用例外机制来处理例外处理用于使系统从故障中恢复提示信息/不产生无效的结果/释放资源,不同的例外处理策略关键性应用(处理所有例外)实验软件(可以忽略许多例外)处理例外时的注意事项终止程序会导致资源泄漏,利用例外处理释放资源尽可能近地处理例外,这样程序清晰易读能在局部处理的错误不要使用例外机制例外机制的处理比正常处理效率低,1、例外的概念,1、例外的概念,例外机制的关键步骤try 定义可能产生例外的代码段catch(Etype e)用于捕获一个例外finally 用于做统一的事后处理,如释放资源throw e;用于抛出一个例外throws Etype1,Etype2 用于声明方法可能抛出的例外类型,throw/throwstry-catch-finally,1、例外的概念,程序中的例外不外乎两种情况:一种是运行环境不能满足程序运行的要求而出错;一种是程序要解决的问题的约束而导致的。不管是哪种情况,编写程序时,程序员要考虑到程序运行时可能遇到的各种情况(条件),并进行处理;如果不能处理,或者不知该如何处理,就可以认为是一种错误,这时,就需要交给别人去处理。以前,是通过返回错误代码来提示别人程序有错误;在Java中,则是通过例外机制通知别人出错信息。,1、例外的概念,例外机制与常规的错误处理方法的不同之处在于:1、错误的表示方法:错误编码对象2、错误处理方法:与常规代码的分离、错误传递机制,2、例外的分类,一个例外是由一个对象来代表的,所有的例外都直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了例外类,这些例外类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。除了Java类库所定义的例外类之外,用户也可以通过继承已有的例外类来定义自己的例外类,并在程序中使用(利用throw产生,throws声明抛出,catch捕捉并处理)。,Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,Java程序不做处理。Runtime Exception:Java虚拟机在运行时生成的例外,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。因此由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。Exception:一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。,2、例外的分类,2、例外的分类,2、例外的分类Throwable类的方法,Throwable()Throwable(String message)String toString()“classname”:“getMessage()”String getMessage()String getLocalizedMessage()void printStackTrace()void printStackTrace(PrintStreams)void printStackTrace(PrintWriter s)Throwable fillInStackTrace(),77:public static void main(String args)78:try 79:testThrowable();80:81:catch(Throwable t)82:System.err.println(t.toString();83:System.err.println(t.getMessage();84:System.err.println(t.getLocalizedMessage();85:t.printStackTrace();86:87:136:static void testThrowable()throws Throwable 137:throw new Throwable(测试 Throwable 的用法。);138:java.lang.Throwable:测试 Throwable 的用法。测试 Throwable 的用法。测试 Throwable 的用法。java.lang.Throwable:测试 Throwable 的用法。at test.Untitled1.testThrowable(Untitled1.java:137)at test.Untitled1.main(Untitled1.java:79),77:public static void main(String args)78:try 79:testThrowable();80:81:catch(Throwable t)82:System.err.println(t.toString();83:System.err.println(t.getMessage();84:System.err.println(t.getLocalizedMessage();85:t.printStackTrace(System.err);86:87:136:static void testThrowable()throws Throwable 137:throw new Throwable();138:java.lang.Throwablenullnulljava.lang.Throwable at test.Untitled1.testThrowable(Untitled1.java:137)at test.Untitled1.main(Untitled1.java:79),2、例外的分类一些常用的例外类,Error(all in java.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(in java.awt),Exception(in java.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedExceptionRuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatException,2、例外的分类一些常用的例外类,RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityExceptionEmptyStackException(in java.util)MissingResourceException(in java.util)NoSuchElementException(in java.util),2、例外的分类一些常用的例外类,ExceptionIOException(in java.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOException,2、例外的分类一些常用的例外类,例外示例:(1)编译时例外:在程序中必须对其进行处理,否则编译器会指出错误。在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。(2)运行时例外:程序中可以不做处理,直接由运行时系统来处理。,2、例外的分类,Java的例外处理是通过3个关键词来实现的:try-catch-finally。用try来监视执行一段程序,如果出现例外,系统就会抛出(throws)例外,可以通过例外的类型来捕捉(catch)并处理它,或最后(finally)由缺省处理方法来处理。,3、捕获例外,try代码段包含可能产生例外的代码try代码段后跟有一个或多个catch代码段每个catch代码段声明其能处理的一种特定类型的例外每个catch代码段都是一段例外处理代码程序继续执行最后一个catch代码段后的代码(或执行完finally代码段后)不同的代码段是不同的作用域,不可访问相互之间定义的局部变量,try/接受监视的程序块,在此区域内发生/的异常,由catch中指定的程序处理;/不能有其它语句分隔catch(要处理的异常种类和标识符)/处理异常;catch(要处理的异常种类和标识符)/处理异常;finally/最终处理(缺省处理);/Other Statements,3、捕获例外,3、捕获例外,try语句 捕获例外的第一步就是用try 语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。在执行过程中,该段代码可能会产生并抛弃一个或多个例外,因此,它后面的catch语句进行捕获时也要做相应的处理。如果没有例外产生,所有的catch代码段都被略过不执行。,3、捕获例外,catch语句 每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的例外并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获得例外类型,运行时系统通过参数值把被抛弃的例外对象传递给catch语句。程序设计中要根据具体的情况来选择catch语句的例外处理类型,一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为catch语句中指定要捕获的类型。当然也可以用一个catch语句处理多个例外类型,这时它的例外类型应该是这多个例外类型的父类,但这种方式使得在程序中不能确切判断例外的具体类型。,public class ExceptionDemo public static void main(String args)try FileInputStream fis=new FileInputStream(test1.txt);int b;while(b=fis.read()!=-1)System.out.print(b);fis.close();catch(FileNotFoundException e)catch(IOException e),catch(IOException e)catch(FileNotFoundException e)/永远不会被执行,catch(Exception e)捕获所有Exception catch(Throwable t)捕获Exception和Error,例外总是由距离产生例外最近的匹配catch代码段处理如果没有相应的例外处理,则例外被交给上一层try代码段进行处理例外处理的查找依据类型匹配原则顺序进行第一个匹配的例外处理被执行,当例外处理执行完毕,程序接着最后一个catch代码段后的语句执行例外处理的顺序影响到例外的处理子类例外可被父类例外处理捕获不要先捕获父类例外,再捕获子类例外如果找不到相应的例外处理非GUI程序将结束程序执行;Applet或GUI程序则回复到事件处理状态,3、捕获例外 catch语句,3、捕获例外 catch语句,尽量避免用一般类型作为catch中指定要捕获的类型。一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,在例外处理中无法访问try代码段中声明的变量因为此时try代码段已经退出了,例外处理所需要的任何信息一般都应该通过例外对象来传递在使用方法时尽量直接处理该方法可能产生的例外这样你的程序就会更健壮在使用库方法之前,应该先仔细阅读说明文档那里会介绍方法可能产生的例外以及例外产生的条件在使用各种例外类之前也应该先仔细阅读说明文档那里会介绍例外的具体含义及例外产生的条件,在catch代码段中产生的例外不是由相同try的后续catch代码段处理,而是由包含整个try-catch结构的上层try代码段检测并处理可以把catch到的例外对象再次抛出,使上层try-catch结构继续处理该例外事件;也可以把例外对象转换为其它例外对象catch(Exception e)throw e;try-catch机制不该被用于流程控制,例外情形应该是很稀少的,而不是经常性的在catch代码段中的return语句用于退出方法,而不是返回到例外抛出点(throw point),3、捕获例外 catch语句,public class TestTryCatchThrow public static void main(String args)try if(args.length 1)throw new Exception(“没有参数!”);InputStream in=new FileInputStream(args0);/readInt可能产生IOException,EOFException int i=in.readInt();System.out.println(“对出的整数为:”+);catch(EOFException e)System.out.println(“错误:文件格式存在问题!”);catch(IOException e)System.out.println(“错误:文件操作中出现问题!”);catch(Exception e)System.out.println(“错误:”+e.getMessage();.,3、捕获例外,finally语句 捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。无论try所指定的程序块中是否抛出例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。(finally语句与switch中的default语句是不同的!)通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、删除临时文件等。,try in=new FileInputStream(“file1.txt”);对文件进行处理的程序;catch(IOException e)/对文件异常进行处理;finally/不论是否发生异常,都关闭文件;,finally在文件处理时非常有用,例外的覆盖 finally代码段中应该把可能产生例外的语句用try-catch保护起来,if(in!=null)try in.close();catch(IOException e),/使用try-catch结构,防止finally代码段抛出例外,如果在一个方法中生成了例外,但是该方法并不处理它产生的例外,而是沿着调用层次向上传递,交由调用它的方法来处理这些例外,这就是声明例外。通常的情况是在该方法中并不确切知道改如何对这些例外进行处理,比如FileNotFoundException类例外,它由FileInputStream的构造方法产生,但在其构造方法中并不清楚如何处理它,是终止程序的执行还是新生成一个文件,这需要由调用它的方法来处理。,4、声明例外(throws语句),声明例外的方法 声明例外的方法是在产生异常的方法名后面加上要抛出(throws)的例外的列表:retType methodName(paramlist)throws exceptionList如类FileInputStream中的read()方法是这样定义的:public int read()th

    注意事项

    本文(java继承、接口与泛型.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开