java继承、接口与泛型.ppt_第1页
java继承、接口与泛型.ppt_第2页
java继承、接口与泛型.ppt_第3页
java继承、接口与泛型.ppt_第4页
java继承、接口与泛型.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 继承、接口与泛型 n 1. 子类与父类的定义 n2. 子类的继承权限 n3. 子类对象的构造过程 n4. 复用和多态性 n5.抽象类、接口 n6 内部类和匿名类 5.1 子类与父类 父类可以是自己编写的类也可以是java类库中的类。利 用继承有利于实现代码的重复使用,子类只需要添加新的功 能代码即可。Java不支持多重继承,即子类只能有一个父类 。 使用关键字extends来声明一个类是另外一个类的子类, 格式如下: class 子类名 extends 父类名 返回 5.2 子类的继承性 父类与子类在同一个文件父类与子类在同一个包父类与子类在同不同包 无允许允许不允许 private不允许不允许不允许 protected允许允许允许 public允许允许允许 5.3 子类对象的构造过程 1)父类和子类的构造方法哪个先执行? 2)父类多个的构造函数中那个被执行? 2)如何指定执行父类某个特定的构造函数? 3)子类可以访问父类的私有成员吗? 5.3 子类对象的构造过程 子类对象内存示意图如下图 子类未继承的成员 子类未继承的成员 引用 子类对象 子类继承的成员 子类继承的成员 子类声明的成员 子类声明的成员 5.4 成员变量的隐藏和方法的重写 1成员变量的隐藏(覆盖) n class A n n private int x=10; void h() n System.out.println(“x=“ + x); n n n class B extends A n n private double x = 1.1; n void g() n n float z=x + 100; n System.out.printf(“z=%fn“,z); n n 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 Outer size+; 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是支持泛型的编 译器,它将运行时类型检查提前到编译时执行,使代码更安 全。 返回 作业:使用抽象类或接口完成以下程 序,并说明与不使用抽象类有何不同 n1.编写一个控制台程序,完成 n1)首先提示用户选择输入数据类型 n c表示字符,s表示字符串,i表示整数,r表示浮点 数 n2)用户输入选择后,提示用户输入待排序数据,每次 输入以回车结束,并提示用户再次输入 n3)最后一次用户直接回车表示用户输入结束 n4)对用户输入的数据从大到小排序,并友好的显示排 序结果 n【问题描述】 设停车场是一个可停放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语句。 n 没有错误处理的程序: FILE f = openTheFile(“c:a.xml”); int len = getFilesize(f); char c =allocatememory(len); c = readfile(f); closeFile(f); 1、异常的概念 1、异常的概念 n 以常规方法处理错误: 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; 以常规方法处理错误存在的问题: n观察前面的程序,大家会发现大部分精力花在 出错处理上了 n 只把能够想到的错误考虑到,对以外的情况无 法处理 n 程序可读性差,大量的错误处理代码混杂在程 序中 n 出错返回信息量太少,无法更确切的了解错误 状况或原因 1、异常的概念 1、异常的概念 Java通过面向对象的方法来处理程序错误,在Java中 ,错误被称为例外或异常(Exception)。 在一个方法的运行过程中,如果发生了例外,则这个 方法(或者是Java虚拟机)生成一个代表该例外的对象( 包含了该例外的详细信息),并把它交给运行时系统,运 行时系统寻找相应的代码来处理这一例外。我们把生成例 外对象并把它提交给运行时系统的过程称为抛弃(throw)一 个例外。 运行时系统在方法的调用栈中查找,从生成例外的方 法开始进行回朔,直到找到包含相应例外处理的方法为止 ,这一个过程称为捕获(catch)一个例外。 1、异常的概念 n 用异常的形式处理错误: 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、异常的概念 例外机制的优点: n把错误处理代码从常规代码中分离出来 n按错误类型和差别分组(类Exception,派生) n对无法预测的错误的捕获和处理(基类) n克服了传统方法的错误信息有限的问题(getMessage) n把错误传播给调用堆栈(比较:全局变量,返回值) method1 method2 method3 method4探测抛出例外 传 递 捕获处理例外 调 用 1、例外的概念 什么情况下使用例外机制? n当方法因为自身无法控制的原因而不能完成其任务 n文件不存在,网络连接无法建立 n处理在方法、类库、类中抛出的例外 n如FileInputStream.read产生IOException n在大的项目中采用统一的方式处理错误时 n如编写一个文字处理器 n例外应该是不经常发生但却可能发生的故障 n一定发生的事件不应该用例外机制来处理 n例外处理用于使系统从故障中恢复 n提示信息/不产生无效的结果/释放资源 n不同的例外处理策略 n关键性应用(处理所有例外) n实验软件(可以忽略许多例外) n处理例外时的注意事项 n终止程序会导致资源泄漏,利用例外处理释 放资源 n尽可能近地处理例外,这样程序清晰易读 n能在局部处理的错误不要使用例外机制 n例外机制的处理比正常处理效率低 1、例外的概念 1、例外的概念 例外机制的关键步骤 ntry n定义可能产生例外的代码段 ncatch (Etype e) n用于捕获一个例外 nfinally n用于做统一的事后处理,如释放资源 nthrow e; n用于抛出一个例外 nthrows Etype1, Etype2 n用于声明方法可能抛出的例外类型 throw / throws try-catch-finally 1、例外的概念 程序中的例外不外乎两种情况:一种是运行环境不能 满足程序运行的要求而出错;一种是程序要解决的问 题的约束而导致的。 不管是哪种情况,编写程序时,程序员要考虑到程序 运行时可能遇到的各种情况(条件),并进行处理; 如果不能处理,或者不知该如何处理,就可以认为是 一种错误,这时,就需要交给别人去处理。 以前,是通过返回错误代码来提示别人程序有错误; 在Java中,则是通过例外机制通知别人出错信息。 1、例外的概念 例外机制与常规的错误处理方法的不同之处在于: 1、错误的表示方法:错误编码对象 2、错误处理方法:与常规代码的分离、错误传递机制 2、例外的分类 一个例外是由一个对象来代表的,所有的例外都 直接或间接地继承自Throwable类。 在Java类库的每个类包中都定义了例外类,这些 例外类分成两大类:Error类及Exception类,后者是 Java程序中需要大量处理的。 除了Java类库所定义的例外类之外,用户也可以 通过继承已有的例外类来定义自己的例外类,并在 程序中使用(利用throw产生,throws声明抛出, catch捕捉并处理)。 n Error:由Java虚拟机生成并抛出,包括动态链接失败 、虚拟机错误等,Java程序不做处理。 n Runtime Exception:Java虚拟机在运行时生成的例 外,如被0除等系统错误、数组下标超范围等,其产生比 较频繁,处理麻烦,对程序可读性和运行效率影响太大 。因此由系统检测, 用户可不做处理,系统将它们交给缺 省的异常处理程序(当然,必要时,用户可对其处理) 。 n Exception:一般程序中可预知的问题,其产生的例 外可能会带来意想不到的结果,因此Java编译器要求 Java程序必须捕获或声明所有的非运行时异常。 2、例外的分类 2、例外的分类 Throwable Error Exception RuntimeException 缺省的例外 处理程序 由用户捕获或 声明并处理 不做处理 用户自己产生的例外 处理 2、例外的分类 Throwable类的方法 nThrowable() nThrowable(String message) nString toString() n“classname” : “getMessage()” nString getMessage() nString getLocalizedMessage() nvoid printStackTrace() nvoid printStackTrace(PrintStream s) nvoid printStackTrace(PrintWriter s) nThrowable fillInStackTrace() Throwable ErrorException RuntimeException 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.Throwable null null java.lang.Throwable at test.Untitled1.testThrowable(Untitled1.java:137) at test.Untitled1.main(Untitled1.java:79) 2、例外的分类 一些常用的例外类 nError (all in java.lang) nLinkageError nThreadDeath nVirtualMachineError nInternalError nOutOfMemoryError nStackOverflowError nUnknownError nAWTError (in java.awt) n nException (in java.lang) nClassNotFoundException nCloneNotSupportedException nInterruptedException n nRuntimeException nArithmeticException nClassCastException nInllegalArgumentException nInllegalThreadStateException nNumberFormatException 2、例外的分类 一些常用的例外类 nRuntimeException nInllegalMonitorStateException nInllegalStateException nIndexOutOfBoundsException nArrayIndexOutObBoundsException nStringIndexOutObBoundsException nNegativeArraySizeException nNullPointerException nSecurityException n nEmptyStackException (in java.util) nMissingResourceException (in java.util) nNoSuchElementException (in java.util) n 2、例外的分类 一些常用的例外类 nException nIOException (in java.io) nCharConversionException nEOFException nFileNotFoundException nInterruptedIOException n 2、例外的分类 一些常用的例外类 n 例外示例: (1)编译时例外:在程序中必须对其进行处理, 否则编译器会指出错误。 在使用能够产生异常的方法而没有捕获和处理,程序 将不能通过编译。 (2)运行时例外:程序中可以不做处理,直接由 运行时系统来处理。 2、例外的分类 Java的例外处理是通过3个关键词来实现的 :try-catch-finally。用try来监视执行一段程序 ,如果出现例外,系统就会抛出(throws)例 外,可以通过例外的类型来捕捉(catch)并处 理它,或最后(finally)由缺省处理方法来处 理。 3、捕获例外 ntry代码段包含可能产生例外的 代码 ntry代码段后跟有一个或多个 catch代码段 n每个catch代码段声明其能处 理的一种特定类型的例外 n每个catch代码段都是一段例 外处理代码 n程序继续执行最后一个catch 代码段后的代码 (或执行完finally代码段后) n不同的代码段是不同的作用域 ,不可访问相互之间定义的局 部变量 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(FileNotFoundException e) catch(IOException e)catch(IOException e) catch(IOException e) catch(FileNotFoundException e) /永远不会被执行 n catch(Exception e) n 捕获所有Exception n catch(Throwable t) n 捕获Exception和 Error n例外总是由距离产生例外最近的匹配catch代码段处理 n如果没有相应的例外处理, n则例外被交给上一层try代码段进行处理 n例外处理的查找依据类型匹配原则顺序进行 n第一个匹配的例外处理被执行,当例外处理执行完毕,程序 接着最后一个catch代码段后的语句执行 n例外处理的顺序影响到例外的处理 n子类例外可被父类例外处理捕获 n不要先捕获父类例外,再捕获子类例外 n如果找不到相应的例外处理 n非GUI程序将结束程序执行; nApplet或GUI程序则回复到事件处理状态 3、捕获例外 catch语句 3、捕获例外 catch语句 n尽量避免用一般类型作为catch中指定要捕获的类型。 n一般应该按照try代码块中例外可能产生的顺序及其真正类型 进行捕获和处理, n在例外处理中无法访问try代码段中声明的变量 n因为此时try代码段已经退出了,例外处理所需要的任何信息 一般都应该通过例外对象来传递 n在使用方法时尽量直接处理该方法可能产生的例外 n这样你的程序就会更健壮 n在使用库方法之前,应该先仔细阅读说明文档 n那里会介绍方法可能产生的例外以及例外产生的条件 n在使用各种例外类之前也应该先仔细阅读说明文档 n那里会介绍例外的具体含义及例外产生的条件 n在catch代码段中产生的例外不是由相同try的后续 catch代码段处理,而是由包含整个try-catch结构的上 层try代码段检测并处理 n可以把catch到的例外对象再次抛出,使上层try-catch 结构继续处理该例外事件;也可以把例外对象转换为 其它例外对象 ncatch (Exception e) throw e; ntry-catch机制不该被用于流程控制,例外情形应该是 很稀少的,而不是经常性的 n在catch代码段中的return语句用于退出方法,而不是 返回到例外抛出点(throw point) 3、捕获例外 catch语句 public class TestTryCatchThrow public static void main(String args) try if (args.length 20) | (int2 20) ) NumberRangeException e = new NumberRangeException (“Numbers not within the specified range.“); throw e; answer = int1 + int2; catch (NumberFormatException e) Sy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论