《JAVA基础教程》第三章 Java程序设计基础

上传人:z****2 文档编号:159349490 上传时间:2022-10-08 格式:DOCX 页数:11 大小:33.73KB
返回 下载 相关 举报
《JAVA基础教程》第三章 Java程序设计基础_第1页
第1页 / 共11页
《JAVA基础教程》第三章 Java程序设计基础_第2页
第2页 / 共11页
《JAVA基础教程》第三章 Java程序设计基础_第3页
第3页 / 共11页
点击查看更多>>
资源描述
第三章 Java 程序设计基础3.1 Java 编程概况现在你可以复习一下Java语言的背景材料,它的基本结构象C/C+,但任 何用面向过程语言编写过程序的人都可以了解Java语言的大部分结构.3.1.1 程序结构Java语言的源程序代码由一个或多个编译单元(compilation unit)组成, 每个编译单元只能包含下列内容(空格和注释除外):*一个程序包语句(package stat eme nt )*入口语句(impor t stat emen ts) *类的声明(class declara tions)* 界面声明(interface declarations)每个Java的编译单元可包含多个类或界 面,但是每个编译单元最多只能有一个类或者界面是公共的。Java的源程序代 码被编译?reg;后,便产生了 Java字节代码。Java的字节代码由一?copy;不依 赖于机器的指令组成,这?copy;指令能被Java的运行系统(runtimesystem)有效 地解释。Java的运行系统工作起来如同一台虚拟机。在当前的Java实现中,每 个编译单元就是一个以.java为后缀的文件。每个编译单元有若干个类,编译后, 每个类生成一个.class文件。.class文件是Java虚拟机能够识别的代码。3.1.2 注释三种类型如下:/注释一行/*一行或多行注释*/*文档注释*/文档注释一 般放在一个变量或函数定义 ?reg; 前,指示在任何自动生成文档系统中调入。 这?copy;注释都是声明条目的描述.。3.1.3 标识符变量,函数,类和对象的名称都是标识符,程序员需要标识和使用的东西都 需要标识符。在 Java 语言里,标识符以字符或_,$开头,后面可以包含数字,标识 符是大小写有区别的,没有长度限制。有效的标识符 myname ict_network Hello _sys_path $bill 例子: int a_number; char _onechar; float $bill;关键词 abstract continue for new switch boolean default goto null synchronized break do if package this byte double implements private threadsafe byvalue else import protected throw case extends instanceof public transient catch false int return true char final interface shorttry class finally long static void cons t floa t native super while 其它保留 词以下单词被保留使用: castfuturegenericinneroperatorouterrestvar3.1.4 数据类型Java使用五种基本类型:integer(整数),floating(浮点数),point(指 针),Boolean(布尔变量),Character or String(字符或字符串)。integer整数 下边给出的数据表示都是整数的例子:4, 15, 089, OxADOO整数长度数据类型 表示 8 bits byte 16 bits short 32 bits int 64 bits longfloating 浮点数下边给出的数据表示都是浮点数的例子: 6.37, 3.7E15, 3e8浮点数长度数据类型表示 32 bits float 64 bits doubleBoolean 布尔变量下边是布尔变量的两种可能取值: truefalseCharacter 字符下边给出的都是字符的例子: a t (tab) u?(unicode)String 字符串下边给出的都是字符串的例子: This is a string literal 中国科学院计算所数组你可以定义任意类型的数组. char s; 这是字符型数组;int array;这是整型数组;你还可以定义数组的数组.int block=new int 23; 数组边界在运行时被检测,避免堆栈溢出和内存崩 溃.在Java里,数组实际上是一个对象,数组有一个成员变量:length。你可以 用这个成员函数来查看任意数组的长度.int a = new int 1O3;a.length;/* 1O */aO.length;/* 3 */创建数组在 Java 里创建数组, 你可使用两种基本方法:一。创建一个空数组:int list=new int5O; 或你可以用初始数值填充数组.String names = Chenji,Yuan,Chun,Yang ;相 当 于 下 面 功 能:String names;names = new String4;namesO=new String(Chenji);names1=new String(Yuan);names2=new String(Chun);names3=new String(Yang); 在编译时你不能象下例那样创建静态数组。int name5O;/将产生一个编译错误你也不能用 new 操作去填充一个没定义大小的数组。int name;for (int i=O;i9;i+) namei = i; 3.1.5 表达式Java语言的表达式和C语言非常类似。运算符运算符(operator)优先级从 高到底排列如下:.()+ !instanceof * / % + - =!=&八&|?:= op = , 整数运算符在整数运算时,如果操作数是 long 类型,则运算结果是 long 类型,否则为 int 类型,绝不会是 byte,short 或 char 型。这样,如果变 量i被声明为short或byte, i+1的结果会是int。如果结果超过该类型的取值 范围,则按该类型的最大值取模。单目整数运算符是:运算符操作-单目非位 补码+加 1-减 1+运算符用于表示直接加 1 操作。增量操作也可以用加运算符 和赋值操作间接完成。+lvalue (左值?copy;表示lvalue+=l,+lvalue也表示 lvalue =lvalue +1 (只要 lvalue 没有副作用)。 -运算符用于表示减 1 操作。 +和-运算符既可以作为前缀运算符,也可以做为后缀运算符。双目整数运算符 是:运算符操作*+加-减*乘/除%取模&位与丨位或F立异或右移(带符 号 ) 添 零 右 移 整 数 除 法 按 零 舍 入 。 除 法 和 取 模 遵 守 以 下 等 式 : (a/b)*b+(a%b)=a 整数算术运算的异常是由于除零或按零取模造成的。它将引 发一个算术异常。下溢产生零,上溢导致越界。例如:加1 超过整数最大值,取 模后,变成最小值。一个op=赋值运算符,和上表中的各双目整数运算符联用, 构成一个表达式。整数关系运算符, =, =和!=产生 boolean 类型的数 据。布尔运算符布尔(boolean)变量或表达式的组合运算可以产生新的boolean 值。单目运算符!是布尔非。双目运算符&,丨和八是逻辑AND, OR和X0R运算符, 它们强制两个操作数求布尔值。为避免右侧操作数冗余求值,用户可以使用短路 求值运算符&和丨丨。用户可以使用二二和!=,赋值运算符也可以用&二、|二、八=。 三元条件操作符?:和 C 语言中的一样。浮点运算符浮点运算符可以使用常规运算符的组合:如单目运算符+、 -, 双目运算符+、 -、 *和/,以及赋值运算符+=, -=, *=,和/=。此外,还有取模运 算: %和%=也可以作用于浮点数,例如:a%b和a-(int)(a/b)*b)的语义相同。 这表示 a%b 的结果是除完后剩下的浮点数部分。只有单精度操作数的浮点表达式 按照单精度运算求值,产生单精度结果。如果浮点表达式中含有一个或一个以上 的双精度操作数,则按双精度运算,结果是双精度浮点数。数组运算符数组运算符形式如下: 可给出数组中某个元素的值。合法的取 值范围是从 0 到数组的长度减 1。取值范围的检查只在运行时刻实。运算符以 String 对象实现。运算符+完成并操作,如果必要则自动把操作数转换为 St ring型。如果操作数是一个对象,它可定义一个方法toS tring ()返回该对象 的 St ring 方式,例女口 floa t a = 1.0 pri nt (The value of a is+ a +n); +运算符用到?reg;上的例子St ring s=a=+ a; +=运算符也可以 用于St ring。注意,左边(下例中的si)仅求值一次。s1+=a;/s1=s1+a/若a 非 String 型,自动转换为 String 型。对象运算符双目运算符 instanceof 测试 某个对象是否是指定类或其子类的实例。例如: if(myObjectinstanceofMyClass) MyClass anothermyObject=( MyClass) myObject; 是判定 myObject 是 否是 MyClass 的实例或是其子类的实例。强制和转换 Java 语言和解释器限制使 用强制和转换,以防止出错导致系统崩溃。整数和浮点数之间可以来回 强制转换,但整数不能强制转换成数组或对象。对象不能被强制为基本类型。3.1.6 Java 流控制下面几个控制结构是从 C 语言借鉴的。分支结构if/else 分支结构 if (Boolean) statemanets; else statements; switch 分支结构 switch(expr1) case expr2: statements; break; case expr3: statements; break; default: statements; break; 循环结构 for 循环结构 for (init expr1;test expr2;increment expr3) statements; While 循环结构 While(Boolean) statements; Do 循环结构 do statements; while (Boolean);一 般 顺 序 控 制 break label continue label reutrn expr; label:statement;for 循环例子下面是一个程序例子,画几条线,分别用红,绿,蓝颜色,这段 程序可能是 Java 函数的一部分:int count; for (count=l;count=12;count+) switch (count % 3) case 0: setColor(Color.red); break; case 1: setColor(Color.blue); break; case 2: setColor(Color.green); break; g.drawLine(10,count*10,80,count*10); 3.2 Java变量和函数的实例Java 的类包含变量和函数。数据变量可以是一些原始的类型,如 int,char 等。成员函数是一些可执行的过程。例如,下面程序里: publicclassClassOne inti;publicClassOne()i=10;publicvoidAdd_i(intj)i=i+j; ClassOne包含一个变量i和两个成员函数,ClassOne(int first)和Add_i(int j) 。成 员 函 数 成 员 函 数 是 一 些 可 被 其 它 类 或 自 己 类 调 用 的 处 理 子 程 序。 一 个 特 殊 的 成 员 函 数 叫 构 造 函 数, 这 个 函 数 名 称 一 般 与 本 类 名 程 相 同。 它 没 有 返 回 值。 构 造 函 数和成员函数当你在Java里定义一个类时,你可定义一个 或 多个 可选的构 造函数,当 创 建 本类的一个 对 象时用 某一 个构 造函数来 初始化 本 对 象。用前面的程 序 例子来 说明, 当ClassOne类创 建一个 新 实 例 时,所有成员 函 数和变 量被 创建(创建实例)。构造 函 数 被 调用。 ClassOne mc:mc= newClassOne();关键词new用来创建一个类的实例,一个类用new初始化 前 并 不 占 用 内 存,它 只 是 一 个 类 型 定 义, 当 mc 对 象 初 始 化 后, mc对象里的i变量等于10。你可以通过对象名来引用变 量i。(有时称为实例变量)mc.i+;/mc实例变量加1因为mc有 ClassOne类的所有变量和成员函数,我们可以使用同样的 语法来调用成员函数Add_i: Add_i(10);现在mc.i变量等于21.结束函数Java并不支持析构函数(C+里的定义),因为 java 本 身 提供 对 象 无 用 时 自 动 清 除 的 功 能, 同 时 它 也 提 供 了 一 个 自 动 拉 圾 箱 的 成 员 函 数, 在 清 除 对 象 时 被 调 用: Protected void finalize() close(); 3.3 对 象 有 效 范 围 和 废 物 自 动 回 收对 象 有 一 定 的 生 命 期 并 在 它 的 生 命 期 间 使 用 资 源,当 一 个 对 象 不 再 被 使 用 时,它 应 释 放 内 存, 避 免 内 存 溢 出。 在 Java 里 , 收 集 和 释 放 内 存 是 一 个 叫 自 动 废 品 回 收 站 的 线 程 的 责 任。这 个 线 程 监 视 对 象 有 效 范 围 并 给 一 个 走 出 有 效 范 围 的 对 象 作 上 标 识。例 如 : String s;/ 没 有 分 配 内 存 s = new String(oldstring);/分配内存 s =newstring;/重新分配内 存(创 建 新 对 象) 我 们 将 在 以 后 访 问 String 类 时 将 更 加 明 白 它 的 工 作 过 程,但 它 的 快 速 工 作 过 程 是 这 样 的: 1.创 建 一 个新的St ring类对象并填充以olds tring 2.创建另一个 St ring对象并填充以news tring注意我们创建了两个对 象。 Stirng 对 象 oldstringStirng 对 象 newstring 在 第 三 条 语句里,第一个包括oldstring的叫做s的对象已走出了有 效 范 围, 没 有 任 何 方 法 可 以 再 访 问 他 , 我 们 现 在 有 一 个 新 的对象也叫s,包含newstring。在下一个废品回收线程,前 一 个 对 象 将 被 标 识 并 清 除。3.4 子 类子 类 是 利 用 存 在 的 对 象 创 建 一 个 新 对 象 的 机 制, 比 如, 如果你有一个Horse类,你可以创建一个Zebra子类,Zebra是 Horse 的 一 种。class Zebra ex tends Horse intn umber_0F_s tripes: 关 键 词 ext ends 来定义对象有的子类.Zebra是Horse的子类o Horse类里的所有 特征都将拷贝到Zebra类里,而Zebra类里可以定义自己的成 员函数和实例变量。Zebra称为Horse的派生类或继承。另外 你 也 许 还 想 覆 盖 基 类 的 成 员 函 数。 用 ClassOne 说 明, 下 面 是 一个派生类覆盖Add_i功能的例子.import ClassOne; public class NewClass extends ClassOne public void Add_i(int j) i=i+(j/2); 当 NewClass 类的实例 创 建时, 变量 i 初 始化 值 为10, 但调用Add_i 产 生 不同的结 果。NewClass mnc;mnc=newNewClass();mnc.Add_i(10); 访问控制 Java里 当你 创 建 一 个 新类 时,你可以 标 明 变 量 和成员函 数 的访 问层 次。public public void AnyOneCanAccess() public实 例 变量 和成员 函 数 可 以 任 意 其 它 类 调 用。protected protected void OnlySubClasses() protected 实 例 变 量 和 成 员 函 数 只 能 被 其 子 类 调 用.private private String CreditCardNumber; private实 例变 量和成 员 函 数 只 能 在 本 类 里 调 用.friendlyvoidMyPackageMethod() 缺 省 的, 如 果 没 有 定 义 任 何 防 火控制, 实例变 量 或 函 数 缺 省 定义成friendly,意味着可以 被本包 里的任 意 对 象 防 问, 但 其它包里的对象不可防问。 静 态 成 员 函 数 和 变 量 有 ?copy;时候,你创建一个类,希望 这个类 的所有 实 例 都 公 用 一 个变 量。也就是说,所有这 个 类 的 对 象 都 只 有 实 例 变 量 的 同 一 个 拷 贝。这 种 方 法 的 关键词 是 static, 例 女如 class Block static int number=50; 所有从Block类创建的对象的number变量值都是相同的。 无任在哪个对象里改变了 number的值,所有对象的number都 跟着改变。同样的,你可以定义static成员函数,但这个成员 函 数 不 能 访 问 非 static 函 数 和 变 量。 class Block static int number = 50; int localvalue; static void add_local() localvalue+;/ 没 有运行 static void add_static() number+;/运 行 3.5 this 和 super访问一个类的实例变量时,t his关键词是指向这个类 本 身 的 指 针, 在 前 面 ClassOne 例 子 中, 我 们 可 以 增 加 构 造 函 数 如 下:public class ClassOne int i; public ClassOne() i = 10; public ClassOne (int value) this.i = value; public void Add_i(int j) i = i + j; 这里,this指向ClassOne类的指针。如果在一个子类里覆 盖 了 父 类 的 某 个 成 员 函 数,但 又 想 调 用 父 类 的 成 员 函 数, 你可以用super关键词指向父类的成员函数。import ClassOne; public class NewClass extends ClassOne public void Add_i (int j) i = i+(j/2); super.Add_i (j); 下面程序里,i变量被构造函数设成10,然后15,最后被 父 类 (ClassOne) 设 成 25 。 NewClass mnc; mnc = new NewClass(); mnc.Add_i(10);3.6 类 的 类 型至 今 为 止,我 用 在 类 前 面 只 用 了 一 个 public 关 键 词,其 实 它 有 下 面 4 种 选 择: abstract 一 个 abstract 类 必 须 至 少 有 一 个 虚 拟 函 数, 一 个 abstract 类 不 能 直 接 创 建 对 象, 必 须 继 承 子 类 后 才 能。final 一 个 final 类 声 明 了 子 类 链 的 结 尾, 用 final 声 明 的 类 不能再派生子类。public public类能被其它的类访问。在其 它 包 里, 如 果 想 使用 这 个 类 必 须 先 import, 则 它 只 能 在 它 定 义 的 package 里 使 用。 synchronicable 这 个 类 标 识 表 示 所 有 ?copy; 类 的 成 员 函 数 都 是 同 步 的。3.7 抽 象 类面 向 对 象 的 一 个 最 大 优 点 就 是 能 够 定 义 怎 样 使 用 这 个 类 而 不 必 真 正 定 义 好 成 员 函 数。 如 果 程 序 由 不 同 的 用 户 实 现 时 是 很 有 用 的,这 不 需 用 户 使 用 相 同 的 成 员 函 数 名。在 java 里 Graphics 类 里 一 个 abstract 类 的 例 子 如 下: public abstract class Graphics public abstract void drawLine(int x1,int y1,int x2, int y2); public abstract void drawOval(int x,int y,int width, int height); public abstract void drawRect(int x,int y,int width, int height); . 在 Graphics 类 里 声 明 了 几 个 成 员 函 数 , 但 成 员 函 数 的 实 际 代 码 是 在 另 外 一 ?copy; 地 方 实 现 的。public class MyClass extends Graphics public void drawLine (int x1,int y1,int x2,int y2) 画 线 程 序 代 码 当 一 个 类 包 含 一 个 abstract 成 员 函 数,这 个 类 必 须 定 义 为 abstract 类。然 而 并 不 是 abstract 类 的 所 有 的 成 员 函 数 都 是 abstract的。Abstract类不能有私有成员函数(它们不能被实 现),也 不 能 有 静 态 成 员 函 数。3.8 接 口当你确定多个类的操作方式都很相象时,abstract成员 函数是很有用的。但如果你需要使用这?copy;abstract成员 函 数,必 须 创 建 一 个 新 类,这 样 有 时 很 繁 琐。接 口 提 ?copy; 了 一种 抽 象 成 员 函 数的有 利方法。 一 个 接 口 包 含 了在另一 个地 方 实 现 的 成 员函数 的收集。 成 员 函 数 在 接 口里定义 为public 和 abstract。接口 里的实 例 变 量 是 public,static和final。接 口 和 抽 象 的主要 区别是 一 个 接 口 提 ?copy;了封装 成 员 函 数 协 议 的 方 法 而 不 必 强 迫 用 户 继 承 类。 例 子: public interface AudiClip /Start playing the clip. void play (); /Play the clip in a loop. void loop(); /Stop playing the clip void stop(); 想 使 用 Audio Clip 接 口 的 类 使 用 implenents 关 键 词 来 提 ?copy; 成 员 函 数 的 程 序 代 码。 class MyClass implements AudioClip void play() 实 现 代 码 void loop 实 现 代 码 void stop 实 现 代 码 优 点 一 个 接 口 类 可 以 被 任 意 多 的 类 实 现, 每 个 类 可 以 共 享 程 序 接 口 而 不 必 关 心 其 它 类 是 怎 样 实 现 的。 class MyOtherClass implements AudioClip void stop() 实 现 代 码 . 内部成员函数Java还提?copy; 了调用C和C+函数的方法。用 native 关键词来定义 C 和 C+的函数。public class Date int now; public Date() now = time (); private native int time (); static System.loadLibrary(time); 一 ?copy;Java 代 码 写好后,就需 要以下步骤执行:1用javah来创建头文件(.h) 2.用javah来创 建stub文件3.用C和C+写nat ive成员函数的代码4.编译stub文 件和.C文件成一个动态可加载库5用java运行java程序或 appletviewer 运 行 applet 注 意: Native 成 员 函 数 超 出 了 类 的 范 围。3.9 包(Packages)包(Package)由一 组 类(class)和 界 面(interface)组 成。它是管 理 大 型 名 字 空 间, 避 免 名 字 冲 突 的 工 具。 每 一 个 类 和 界 面 的 名 字 都 包 含 在 某 个 包 中。 按 照 一 般 的 习 惯, 它 的 名 字 是 由. 号 分 隔 的 单 词 构 成, 第 一 个 单 词 通 常 是 开 发 这 个 包 的 组 织 的 名 称。定 义 一 个 编 译 单 元 的 包 编 译 单 元 的 包 由 package 语 句 定 义。 如 果 使 用 package 语 句, 编 译 单 元 的 第 一 行 必 须 无 空 格, 也 无 注 释。 其格式如下: package packageName; 若 编 译 单元无 package 语 句, 则该单元被 置 于 一 个 缺省的无 名 的 包 中。使 用 其 它 包 中 的类和界面 在 Java 语 言里提?copy; 一 个包可 以 使 用 另 一 个包中类和 界 面 的 定 义和实现 的 机 制。用import 关 键 词 来 标 明 来 自 其 它 包 中 的 类。 一 个 编 译 单 元 可 以 自 动 把 指 定 的 类 和 界 面 输 入 到 它 自 己 的 包 中。 在 一 个包中的代码可以有两种方式来定义来自其它包中的 类 和界面: * 在 每个引用 的类和界面前面 给出它们所在的 包的名 字; /前缀包名 法 acme. project.FooBar obj=newacme.projec t. FooBar(); *使用import语句,引入一个类或一个界面, 或 包含它 们 的 包。引入的 类和界面的名字 在当前的名字空 间可用。 引 入 一 个 包时,则该包所有的 公有类和界面均 可 用。 其 形 式 如 下: / 从 acme.project 引 入 所 有 类 import acme.project.*; 这 个 语 句 表 示 acme.project 中 所 有 的 公 有 类 被 引 入 当 前 包。 以 下 语 句 从 acme. project 包 中 进 入 一 个 类 Employec_List 。/从 acme. project 而 引 入 Employee_List importacme.project.Employee_list;Employee_Listobj=newEmployee_List(); 在 使 用 一 个 外 部 类 或 界 面 时, 必 须 要 声 明 该 类 或 界 面 所 在 的包,否则会 产生编 译 错 误。import (引 用)类 包(class package) 用 import 关 键 词 调 入,指 定 package 名 字 如 路 径 和 类 名,用*匹 配 符 可 以 调 入 多 于 一 个 类 名。import java.Date; import java.awt.*;如果java源文件不包含package,它放在缺省的无名 package。 这 与 源 文 件 同 目 录, 类 可 以 这 样 引 入: import MyClass。Java系统包:Java语言提?copy; 了一个包含窗口工具箱, 实用程序,一般I/O,工具和网络功能的包。java.applet 这 个 包 包 含 量 了 一 ?copy; 设 计 applet 的 类, 用 一 个 类 Applet 和 三 个 接 口. AppletContext;AppletStub; 和 AudioClip.java.aw t另一个窗口 工具箱包.aw t,包含了一 ?copy;产生 装饰物和GUI成员的类。这个package包括:Button,Checkbox,Choice,Component,Graphics,Menu,Pane1,TextArea 和 TextField。java.io I/O package 包 含 文 件 输 入/输 出 类, FileInput Stream 和 File OutputStream.java.lang 这 个 包 包 含 Java 语 言 类,包 含:对 象,线 程,异 常 出 口,系 统,整 数,原 点,数 学,字 符 等。这个类支持TCP/IP网络协议,并包含Socket类,URL 和 URL 相 联 系 的 类。java.util 这 个 类 包 含 一 ?copy; 程 序 的 同 步 类, 它 包 含 Date,Dictionary 类 等。3.10 异 常当 在 Java 程 序 中 发 生 一 个 错 误 时,例 如:一 个 变 元 的 值 非法,代码会发现这个错误,并引发一个异常(exception)。 在 缺 省 的 情 况 下, 异 常 会 输 出 一 个 错 误 消 息, 然 后 中 止 线 程 的 执 行。 但 是, 程 序 自 己 可 以 定 义 异 常 处 理 段 (exception handler)来截获(catch)异常,并从错误中恢复。有 一 ?copy;异常是由Java解释器在运行时刻引发的。实际上, 任何类都可以定义属于自己的异常,并使用t hrow语句引 发它们。一个throw (引发?copy;语句是由throw关键字和一个 对 象构 成。 按 常 规, 该 对 象 应 该 是 Exception 类的实例或其子 类的 实 例。 throw 语 句 会 引 起 执 行转向相 应的异常处理段。当一个throw语句执行时,它下面的所有代码不再执行 了, 它 所 在 的 方 法 也 不 再 返 回 值。下面的 例子将演示如何 创建 一 个 Exception 的 子 类, 然 后引发一 个异常。classMyException extends Exception class MyClass void oops()if( /*不 出 现 错 误 */) else /* 出 错 */ else /*出错*/thrownewMyException(); 为 了 定 义 一 个 异 常 处 理 段,程序必须用 try 语 句 把 可 能 产 生 异 常 的 代 码 成 组。 在 try 语句后面跟上一个或多个cat ch(截获?copy;语句,每个异常对应一个 catch 语 句。 每 个 catch 语 句 中 包 含 着 异 常 处 理 段。 例 如: try p.a=10;catch(NullPointerExceptione)println(pwasnull); catch (Exception e) println (other errorsoccured) ; catch (Object obj) println(Who threw that object?); catch 语句和一个方法 定 义 类 似, 只 不 过 该 方 法 只 有 一 个 参 数, 且 无 返 回 类 型。 参 数 可 以 是 一 个 类 或 一 个 界 面。 当 一 个 异 常 发 生 时, 嵌 套 的 try/catch 语 句 会 寻 找 出 与 该 异 常 类 相 匹 配 的 参 数。 如 果 一个参数和 指 定 异 常 匹 配 则:* 该 参 数 和 指 定的异常是 同一个类,或 * 该 参 数 是 指 定 异 常 的 子 类, 或 *如果参数 是一个界面, 指 定 异 常 类 实 现了 这 个 界 面。 第一个参数 和异常匹配 的 try/catch 语 句, 则与 其 匹 配 的 catch语句执行。在catch语句执行完后,程序的执行被恢复。但已不可 能 恢 复 到 异 常 发 生 处 再 次 执 行。 例 如: print ( now) ; try print (is); throw new MyException( ); print (a); catch (MyException e) print (the ); print (timen);打印 now isthetime。 正 如 这 个 例 子 所 示, 异 常 应 该 主 要 用 于 错 误处 理, 若 用 于 其 它 方 面 会 使 代 码 晦 涩 难 ?reg; 。 异 常 处 理 段 是 可 以 嵌 套 的, 允 许 异 常 处 理 可 以 发 生 在 多 个 地 方。 嵌套异常处理通常用于当第一个处理程序无法完全从 错 误 中 恢 复 过 来 的 时 候, 而 不 得 不 执 行 一 ?copy; 清 除 代 码。 为 了 把 异 常 处 理 控 制 传 递 给 更 高 层 的 处 理 段, 可 以 再一次对截获对象实?copy; throw操作。注要再次实t hrow异 常的方法,throw语句执行完后,会终止执行。try f. open (); catch(Exception e) f. close( ); throw e; 定 局语句 finally (定 局?copy;语句是用于保证无论在异常是否发生的情况下, 某?copy;代码被执行。下例说明finally语句的用法:try / 做某?copy;动作; finally /此后清除;和以下代码类似 try /做 某?copy;动 作 catch (Object e) /此 后 清 除;throw e; /此后 清除;即 使try块 中 包 含return, break, continue, throw语 句, finally语句也会被执行。例如:下面的代码finally、总是 被输出,而aftertry仅在 a!=10 时被输出。try if (a=10) return ; finally print (finallyn); print (after try n); 运 行 时 刻 异 常 本 节 列 出 的 清 单 是 Java 解 释 器 引 发 的 各 种 异 常。 当 运 行 时 刻 发 现 各 种 错 误, 由 解 释 器 引 发 异 常。 ArithmeticException 如 果 程 序 试 图 除 0, 或 用 0 取 模, 会 产生Ari thme ticExcep tion (算术异常?copy;,其它算术操作不会 产生异常。有关Java如何处理其它算术错误的信息,见 整 数 运 算 符 和浮点 运 算 符 两 节。 例 如: 下 面 的 代 码 将 会 弓丨 发 Arit hme ti cExcep tion 异 常:class Ari th public s tati c void main (String args ) int j = 0; j = j/j; NullPointerExceptio当 程 序 试 图 访 问 一 个 空 对 象 中 的 变 量 或 方 法, 或 一 个 空 数 组 中的 元素时 则 引 发NullPointerException(空 指 针 异 常?copy;。例 如,访问长度为0的数组a0。有以下类声明,运行时会引 发 NullPointerException 异 常 : class Null public static void main(String args ) String o = null; int a = null; o.length( ); a0=0; 有 趣 的 是, 如 果 我 们 引 发 一 个 空 对 象, 也 会 产 一 NullPointerException 异 常。 IncompatibleClassChangeException 当 一 个 类 的 定 义 被 改 变, 而 引 用 该 类 的 其 它 类 没 有 被 重 新 编 译 时, 会 产 生 这 一 异 常。 有 四 种 类 更 改 会 导 致 运 行 时 刻 引发 Incompa tibleClassChangExcep tion 异常。* 一 个类中的变量声 明由static变成非static,而其它访问该类这一变量的类没 有 被重新编 译。* 一 个 类中 的变量声明由非static变成static,而其 它访问该类这一 变量的类没有被重 新 编 译。* 类 中 声 明 的 某 个 域 被 删 除, 而 其 它 访 问 该 域 的 类 没 有 被 重新编译。 *类中声明的某 个方法被删除,而 其 它访问该 方法的类 没有被重新编译。ClassCastException 如 果 试 图 把 对 象 o 强 制 成 ClassC, 而 o 既 不是Class C的实例,也不是Class C子类的实例,这时便会产 生 ClassCastException。 classClassCastpublicstaticvoidmain(String args)Objecto=newObject();Strings=(string)o;s.length();NagativeArraySizeException 如 果 一 个 数 组 的 长 度 是 负 数, 则 会 引 发NagativeArraySizeException (数 组负下 标?copy;异 常。例 如 下 面 类 定 义 的 代 码 在 运 行 时 引 发 这 一 异 常: class NegArray public static void main(String args ) int a = new int -1; a0 = 0; OutOfMemoryException 当 系 统 无 法 再 向 应 用 程 序 提 ?copy; 内存时,会引发OutOfMemoryException (内存溢出?copy;异常。这 种异常只能出现在创建新对象的时候,即new被调用的时 候。 例 如, 下 面 一 段 代 码 在 运 行 时 刻 会 引 发 OutOfMemoryException 异 常: class Link int a = new int1000000; Link l; Class OutOfMem publicstaticvoidmain(Stringargs)publicstaticvoidmain(String args)Linkroot=newlink();Linkcur=root;while(true)cur.l =new Link( ); cur = cur.l; NoClassDefFoundException女口 果 个 类 被 引 用, 但 在 运 行 时 刻, 系 统 没 有 找 到 被 引 用 的 类, 这 时会引发NoClassDefFoundException (未找到类定义?copy;异常。 例 如, NoClass 的 声 明 如 下: classNoClasspublicstaticvoidmain(Stringargs) C c = new C ( ); 当 NoClass 运 行 时, 如 果 解 释 器 找 不 到 C 类, 则 会 产 生 NoClassDefFoundException。 注 意, 在 NoClass 被 编 译 时C类一定要存在。IncompatibleType Exception 如 果 试 图 为 一 界 面 作 实 例, 则 会引发IncompatibleTypeException(类型不兼容?copy;异常。例女如 下面 的代 码会引 发一个 IncompatibleTypeException。Interface I class IncompType public static void main(String args ) I r = (I) new (I) ; ArrayIndexOutOfBoundsException 试 图 访 问 数 组 中 的 一个非法元素时,会引发ArrayIndexOutOfBoundsException (数组 索引越界?copy;异常。例女如 Class ArrayOut public static void main(String args ) int a =new int0; a0=0; public static void main(String args ) int a =new int0; a0=0; UnsatisfiedLinkException 如 果 一 个 方 法 被 声 明 为 本 机, 但 该 方 法 在 运 行 时 刻 却 不 能 连 接 到 一 个 例 程 体 上 去 时,会 产 生 UnsatisfiedLinkException (无 法 连 接?copy;异 常。例 女如 Class NoLink static native void foo( ); public static void main(String args ) foo( ); InternalException InternalException(内 部?copy; 异 常 是 不 能 被 引 发 的。 只 有 在 运 行 失 败 作 一 致 性 检 查 时, 才 会 引 发 这 个 异 常。本章小结1.Java 语 言 的 基 本 结 构 象 C/C+。 2. Java 语 言 的 源 程 序 代 码由一个或多个编译单元(comp ilat ion uni t)组成。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


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

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


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