第四章 Java 数组和工具类

66
第第第 第第第 Java Java 第第第第第第 第第第第第第 4.1 第第 4.2 第第第 4.3 第第第第第第 4.4 Applet 第第 Applet 第第 4.5 第第第第

description

第四章 Java 数组和工具类. 4.1 数组 4.2 字符串 4.3 语言基础类库 4.4 Applet 类与 Applet 程序 4.5 异常处理. 4.1 数组. 在 Java 中,数组是一种专门的类型,它是有序数据的集合,数组中的每个元素的数据类型都是相同的。 对元素的确定是由数组名和它的下标实现的,如 a[0] 代表数组 a 的第一个元素, a[1] 代表数组 a 的第二个元素,依次类推。. 4.1.1 数组声明 (一). 1 .数组的声明 Java 的数组声明采用与C语言类似的形式。数组可分为一维数组和多维数组。它们的声明的形式为: - PowerPoint PPT Presentation

Transcript of 第四章 Java 数组和工具类

Page 1: 第四章  Java 数组和工具类

第四章 第四章 JavaJava 数组和工具类 数组和工具类 4.1 数组 4.2 字符串 4.3 语言基础类库 4.4 Applet 类与 Applet 程序 4.5 异常处理

Page 2: 第四章  Java 数组和工具类

4.1 4.1 数组 数组 在 Java 中,数组是一种专门的类型,它是

有序数据的集合,数组中的每个元素的数据类型都是相同的。

对元素的确定是由数组名和它的下标实现的,如 a[0] 代表数组 a 的第一个元素, a[1] 代表数组 a 的第二个元素,依次类推。

Page 3: 第四章  Java 数组和工具类

4.1.1 4.1.1 数组声明 (一)数组声明 (一)1 .数组的声明

Java 的数组声明采用与C语言类似的形式。数组可分为一维数组和多维数组。它们的声明的形式为:type arrayName [] [[]...]; 或另一等价形式:type [] [[]...] arrayName;

Page 4: 第四章  Java 数组和工具类

4.1.1 4.1.1 数组声明 (二)数组声明 (二) 例如:

int count[]; // 一维整型数组 count char ch[][]; // 二维字符型数组 ch float[] fNum; // 一维浮点型数组 fNum

后一种数组声明形式体现了 Java 的纯面向对象的特征。如下例所示: int[] TestArray(int arraySize) { int[] aId = new int [arraySize]; return aId; }

Page 5: 第四章  Java 数组和工具类

4.1.1 4.1.1 数组声明 (三)数组声明 (三)2 .创建数组空间 Java 数组声明中,不需要指明数组大小,这是因为

数组声明并未为数组元素分配存储单元。要为数组元素分配存储单元,必须显示使用 new 运算符实现。其格式如下: arrayName[][[]...] = new type [Size1][[Size2]...]; 或 arrayName = new type [Size1][[Size2]...];

Page 6: 第四章  Java 数组和工具类

4.1.1 4.1.1 数组声明 (四)数组声明 (四) 声明数组与为数组分配存储单元两部分,可以合在一起,它们的格式如下:type arrayName[][[]...] = new type [Size1][[Size2]...];

或type [][[]...] arrayName = new type [Size1][[Size2]...]; 例如:

int count[] = new int [10]; char ch[][] = new char [3][5]; float[] fNum = new float [20];

Page 7: 第四章  Java 数组和工具类

4.1.2 4.1.2 数组元素的引用及初始化(一)数组元素的引用及初始化(一) 对已经分配了存储空间的数组 ( 由 new 运算符实现 ) ,就

可以对数组中的每一个元素引用。下标是放在数组名后面 []中的,通过对下标的操作来引用元素。我们可以赋值给元素,也可以使用元素的值。

数组元素引用的形式为: arrayName[index1][[]...]

其中, index1 等为数组的下标。数组元素下标是从 0 开始的,所以最后一个元素的下标为 arraySize-1 。对于每一个数组,都有一个属性 length ,来指明数组的长度。

Page 8: 第四章  Java 数组和工具类

4.1.2 4.1.2 数组元素的引用及初始化(二)数组元素的引用及初始化(二) 例如:

int count[] = new int [10]; //count[0] , count[1] , ... , count[9] ;char ch[][] = new char [3][5]; //ch[0][0] , ch[0][1] , ... , ch[2][4] ;

float[] fNum = new float [20];//fNum[0], fNum[1], ... , fNum[19]

这三个数组的属性分别为: count.length=10 ch.length=3 // 多维数组是第一维大小 fNum.length=20

Page 9: 第四章  Java 数组和工具类

4.1.2 4.1.2 数组元素的引用及初始化(三)数组元素的引用及初始化(三)数组元素的引用及初始化 在声明数组时,也可以同时对数组进行初始化。它的一维形式如下: type arrayName[] = {Value1, Value2, ... , ValueN}; 例如:

float myf[] = {1,2,3,4,5,6}int myint[][]={{1,2,3},{4,5,6}};//int myint[][]=new myint[2][3];

与C或C ++ 语言不一样, Java 对数组元素的下标要进行越界检查,以确保数据的安全。▼

Page 10: 第四章  Java 数组和工具类

4.2 4.2 字符串字符串 字符串是编程中经常要用到的数据结构,它是字符的序列,从某种程度上来说类似于字符的数组。

实际上,在 C 语言中,字符串就是用字符数组来实现的。 而在面向对象的 Java 语言中,字符串是用类来实现的。

程序中用到的字符串分成两大类: 字符串常量 : 在 Java 中存放字符串常量的对象属于 String 类; 字符串变量 : 对于字符串变量,由于程序经常需要对它做添加、插入、修改之类的操作,所以一般都存放在 StringBuffer 类的对象中。

Page 11: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (一)类 (一) 字符串常量用 String 类的对象表示。

字符常量是用单引号扩起来的单个字符,例如:‘ a’ 、‘ /n’ 等; 字符串常量是用双引号扩起来的字符序列,例如:“ a” 、“ /n” 、“Hello” 等。

C 语言中的字符串是由数组组成的,每个字符串的末尾以”\0” 标志; 而 Java 的字符串常量,通常作为 String 类的对象存在,有专门的属性来规定它的长度。 对于所有用双引号扩起来的字符串常量,系统都会为它创建一个无名的 String 类型对象。

Page 12: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (二)类 (二)1 .创建 String 对象

String 类的构造函数及其使用方法如下: public String() :用来创建一个空的字符串变量。 public String(String value) :利用已存在的字符串常量创建一个新的 String 对象,可以是用双引号扩起来的直接常量。 public String(StringBuffer buffer) :用利用已存在的 StringBuffer 对象为新创建 String 对象初始化。 public String(char value[]) :利用已存在的字符数组的内容初始化新建的 String 对象。

Page 13: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (三)类 (三)下面是创建 String 对象的例子:

String s;// 声明一个 String 对象,此时 s 的值为空。

s = new String(“abc”);// 为 s 开辟内存空间,并初始化。

String s = new String(“abc”);// 把上两个语句的功能合二为一。

String s = "abc";// 这里的赋值是一种特殊的省略写法, Java 系统会自动为用双引号扩起来的字符串常量创建一个 String 对象,所以该语句的实际效果同上。

Page 14: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (四)类 (四)2 .求字符串常量的长度

public int length(); 例子:

String s = "Hello!" ;System.out.println(s.length());String t = “你过得可好?” ;System.out.println(t.length());

结果:66

Page 15: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (五)类 (五)3 .判断字符串的前缀、后缀public boolean startsWith(String prefix);public boolean endsWith(String suffix); 例 1 :如成都地区的邮政编码以 61 开头。

if(s.startsWith(“61”)System.out.println(“ 成都地区” ) ;

例 2 :老居民身份证号码最后一位代表性别。if(s.endsWith("0")||s.endsWith("2")||s.endsWith("4") ||s.endsWith("6")||s.endsWith("8"))

System.out.println("此人是女性!") ;

Page 16: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (六)类 (六)4 .字符串中单个字符的查找

public int indexOf(int ch);public int indexOf(int ch,int fromIndex);方法一:查找字符 ch 在当前字符串中第一次出现的位置,如果找不到则返回 -1 。方法二:从在当前字符串的第 fromIndex 位字符之后,开始查找字符 ch 第一次出现的位置如果找不到则返回 -1 。 下面两个方法与上面的方法类似,只是从尾部往前开始查找:

public int lastIndexOf(int ch);public int lastIndexOf(int ch,int fromIndex);

Page 17: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (七)类 (七)例子:String s = “Java 是面向对象的语言,

JavaScript 是脚本语言。” ;int i = s.indexOf((int)'J');System.out.println(i);int j = s.indexOf((int)'J',6);System.out.println(j); int a = s.lastIndexOf((int)'J');System.out.println(a);int b = s.lastIndexOf((int)'J',10);System.out.println(b);

结果:013 130

Page 18: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (八)类 (八)5 .字符串中子串的查找public int indexOf(String str);

public int indexOf(String str,int fromIndex);

public int lastIndexOf(String str);

public int lastIndexOf(String str,int fromIndex);

public char charAt(int index);

// 获取当前字符串中第 index 位的字符

Page 19: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (九)类 (九)例子:String s = “Java 是面向对象的语言, JavaScript 是脚本语言。” ;int i = s.indexOf(“ 语言” );System.out.println(i);int j = s.indexOf(“ 语言” ,12);System.out.println(j);char c = s.charAt(5);System.out.println(c);

结果:1026面

Page 20: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (十)类 (十)6 .比较两个字符串public int compareTo(String anotherString);

public boolean equals(Object anoObject);

public boolean equalsIgnoreCase(String anotherString); 方法一:如果当前字符串与参数字符串完全相同,则 compareTo

() 方法返回 0 ;如果当前字符串按字母序大于参数字符串,则 compareTo() 方法返回大于 0 的整数;反之,则返回小于 0 的整数。

方法二: equals 重载 Object 类的方法,如果当前字符串与参数字符串完全相同,则返回真,否则返回假。 方法三: equalsIgnoreCase 与方法 equals 的用法相似,只是它比较时不计大小写。

Page 21: 第四章  Java 数组和工具类

4.2.1 String4.2.1 String 类 (十一)类 (十一)7 .连接字符子串

public String concat(String str);该方法把参数字符串连接到当前字符串的尾部,并返回这个连接而成的字符串,但当前字符串本身不改变。例子:

String s = "Hello ";System.out.println(s.concat("World! "));System.out.println(s);

结果:Hello World!Hello

Page 22: 第四章  Java 数组和工具类

4.2.2 StringBuffer4.2.2 StringBuffer 类(一)类(一) StringBuffer 类的每个对象都是可以扩充和修改的字符串变量。 1 .创建 StringBuffer 对象

StringBuffer 类的构造函数如下:public StringBuffer();// 创建了一个空的 StringBuffer 对象public StringBuffer(int length);// 给出了新建的 StringBuffer 对象的长度public StringBuffer(String str); // 利用一个已经存在的字符串 String 对象来初始化 StringBuffer 对象。

Page 23: 第四章  Java 数组和工具类

4.2.2 StringBuffer4.2.2 StringBuffer 类(二)类(二) 例子:StringBuffer myStrBuff1 =new StringBuffer();

StringBuffer myStrBuff2 =new StringBuffer(5);

StringBuffer myStrBuff3 =new StringBuffer("Hello!");

Page 24: 第四章  Java 数组和工具类

4.2.2 StringBuffer4.2.2 StringBuffer 类(三)类(三)2 .字符串变量的扩充、修改和操作 两组用来扩充其中所包含的字符的方法:

public StringBuffer.append( 参数类型 参数名 ) ;public StringBuffer.insert(int 插入位置 , 参数类型 参数名 ) ;

例子:StringBuffer myStrBuff = new StringBuffer();myStrBuff.append("Hello, Guys!");System.out.println(myStrBuff.toString());myStrBuff.insert(6,30);System.out.println(myStrBuff.toString());

Page 25: 第四章  Java 数组和工具类

4.2.2 StringBuffer4.2.2 StringBuffer 类(四)类(四) 结果:Hello, Guys!Hello,30 Guys!

注意:println 方法不接受 StringBuffer 类型的参数,若希望在屏幕上显示出来,必须先调用 toString 方法把它转换成字符串常量。

Page 26: 第四章  Java 数组和工具类

4.2.2 StringBuffer4.2.2 StringBuffer 类(五)类(五) StringBuffer 的用来修改字符串的方法:

public void setCharAt(int index, char ch); 例子:StringBuffer myStrBuff = new StringBuffer("goat");System.out.println(myStrBuff.toString());myStrBuff.setCharAt(0, 'c ');System.out.println(myStrBuff.toString()); 结果:

goatcoat

Page 27: 第四章  Java 数组和工具类

4.2.2 StringBuffer4.2.2 StringBuffer 类(六)类(六)3 .字符串的赋值和加法 字符串是经常使用的数据类型,为了编程方便, Java 编译系统中引入了字符串的加法和赋值。 例子:

String myStr = "Hello,";myStr = myStr + "Guys!";

这两个语句初看是乎有问题,因为 String 是字符串常量,实际上它们相当于:String myStr = new StringBuffer().append("Hello,").toString();myStr = new StringBuffer().append(MyStr). append("Guys!").toString();

Page 28: 第四章  Java 数组和工具类

4.2.3 Java Application4.2.3 Java Application 命令行参数 命令行参数 Java Application 程序中用用 main( )方法中的参数 args[] 来接受命令行参数。

该参数是一个字符串数组,每个数组元素保存一个输入的命令行参数。

Page 29: 第四章  Java 数组和工具类

4.3 语言基础类库Object 类数据类型类Math 类System 类

Page 30: 第四章  Java 数组和工具类

一.一. ObjectObject 类类Object 类是 Java 中所有类的直接或间接父类。 它的主要方法如下: protected Object clone();生成当前对象的一个拷贝,并返回这个复制对象。 public boolean equals(Object obj);比较两个对象是否相同,是则返回 true 。 public final Class getClass();获取当前对象所属的类信息,返回 Class 对象。 ptotected void finalize();定义回收当前对象所需完成的清理工作。 public String toString();返回当前对象的有关信息。

Page 31: 第四章  Java 数组和工具类

二.数据类型类二.数据类型类 表:数据类型类与对应的基本数据类型

数据类型类 基本数据类型Boolean booleanCharacter charDouble doubleFloat floatInteger intLong long

Page 32: 第四章  Java 数组和工具类

IntegerInteger 类类MAX_VALUE 域和 MIN_VALUE域

– 规定了 int 类型的最大值和最小值。 构造函数

– public Integer(int value);– public Interger(String s);

数据类型转换– public double doubleValue();– public int intValue();– public long longValue();

Page 33: 第四章  Java 数组和工具类

IntegerInteger 类类 字符串与 int 量的转换

– public String toString()把当前对象所对应的 int 量转化为字符串。

– public stactic int parseInt(String s)可方便的把字符串转换为 int 量。

例子: int i = Integer.parseInt(“250”); 其它字符串转换方法

– public stactic Interger valueOf(String s)例子: int i = Integer.valueOf(“250”).intValue();

其它数据类型 : 例子: float f = Float.parseFloat(“25.0;)Double d = Double.parseDouble(“25.7890);Long l = Long.parseLong(“25”);

Page 34: 第四章  Java 数组和工具类

三.三. MathMath 类类public final static double E;// 数学常量 epublic final static double PI; // 圆周率常量public static double abs(double a); // 绝对值public static double acos(double a); // 反余弦public static double exp(double a); //e 的参数次幂public static double log(double a); // 自然对数public static double ramdom(); // 产生 0 到 1 之间的伪随机数public static double pow(double a, double a);// 乘方public static double sqrt(double a); // 平方public static double rint(double a); // 四舍五入

Page 35: 第四章  Java 数组和工具类

四.四. SystemSystem 类类 System 不能实例化,所以它的所有方法和属性都是 static的。 三个属性:

– public static PrintStream err; // 标准错误输出– public static InputStream in; // 标准输入– public static PrintStream out; // 标准输出例子: char c = System.in.read(); System.out.println(“Hello!”);

常用方法– public static void exit(int status); // 强制退出运行状态,并把状态信息返回给运行虚拟机的操作系统。例子: System.exit(0);

Page 36: 第四章  Java 数组和工具类

四.四. SystemSystem 类类java.lang.Object

java.io.OutputStreamjava.io.FilterOutputStream

java.io.PrintStream void flush() void print(boolean b) void print(char c) void print(char[] s) void print(double d) void print(float f) void print(int i)  voidprint(long l) void print(Object obj) void print(String s) void println() void println(boolean x)  void println(char x) void println(char[] x) void println(double x) void println(float x)  void println(int x) void println(long x) voidp rintln(Object x) void println(String x)  void write(byte[] buf, int off, int len) voidwrite(int b)

Page 37: 第四章  Java 数组和工具类

4.4 Applet4.4 Applet 类与类与 AppletApplet 程序程序一. Applet 类Applet 类存在于 java.applet 包中,是 java.awt.Panel 的子类。Panel 是 Container 的一种,它可以:

– 包容和排列其它的界面元素,如按钮、对话框和其它容器– 响应它所包容范围之内的事件,或把事件向更高层次传递

Applet 在拥有上述作用的基础上,还具有一些与浏览器和 Applet 生命周期有关的方法。

Page 38: 第四章  Java 数组和工具类

二.二. AppletApplet 类的主要方法类的主要方法 用户自定义的 Applet 子类是 Java Applet 程序的标志。 在实际运行中,浏览器在下载字节码的同时,会自动创建一个用户定义的 Applet 子类的实例,并在适当的时候自动调用相应的实例方法。 init() 方法

– 完成实例的初始化工作。– 浏览器创建 Applet 子类的实例,并调用该方法。

start() 方法– 用来启动浏览器运行 Applet 的主线程。– init() 初始化后调用 start() 方法。– 包含 Applet 的 HTML页面被重新加载时,其中的 Applet 实例会被重新启动并调用 start() 方法,但 init() 方法只被调用一次。

Page 39: 第四章  Java 数组和工具类

Paint()Paint() 方法方法 主要作用:在 Applet 的界面中显示文字、图形和其它界面元素。 paint() 方法有一个固定参数: Graphics 类的对象 g 。

– 当 Applet 子类的实例被初始化并启动时,浏览器将自动生成一个 Graphics 类的实例 g ,并将 g 作为参数传给Applet 实例的 paint() 方法。 导致浏览器调用 paint() 方法的事件:

– Applet 被启动后,自动调用 paint() 方法重新绘制自己的界面。– Applet 所在的浏览器窗口被改变,例如窗口被放大、缩小、移动或被其它窗口遮挡由重新显示在最前方等,都需重绘界面。– 其它相关方法被调用,也会相应调用 paint() 方法。

Page 40: 第四章  Java 数组和工具类

stop()stop() 方法和方法和 destroy()destroy() 方法方法stop() 方法

– 类似于 start() 方法的逆操作。– 当用户浏览其它 WWW页面或切换到其它应用时,浏览器将暂停执行 Applet 的主线程,在暂停之前会调用 stop() 方法。

destroy() 方法– 当用户退出浏览器时, Applet 实例也被消灭,消灭之前调用 destroy() 方法完成一些释放资源、关闭连接之类的操作。

Page 41: 第四章  Java 数组和工具类

AppletApplet 的生命周期的生命周期

下载并实例化 Applet

destroy()消亡

init() 初始化

stop() 中止

start() 启动启动 Applet

Applet 转入后台 重新激活 Applet

退出浏览器

Page 42: 第四章  Java 数组和工具类

例子例子

Page 43: 第四章  Java 数组和工具类

三.三. HTMLHTML 文件参数传递文件参数传递 在 <APPLET> 和 </APPLET> 之间嵌入 Applet 标记,常用参数: code , height 和 width 。 一些可选参数: codebase :当 Applet 字节码文件和它所嵌入的 HTML文档所在的目录不同,用 codebase 指明 Applet 所在的位置,用URL 格式表示,例如:

codebase=http://www.illusion.org/Applet/MyApplet.class alt :如果浏览器不支持 Java 就无法执行字节码,就把 alt 参数指明的信息显示给用户,例如:

alt =“This is a Java Applet ,your browser cant not understand” align :指明 Applet 界面区域在浏览器窗口的位置情况,例如:

align=CENTER

Page 44: 第四章  Java 数组和工具类

<PARAM><PARAM> 标记标记HTML文件可向它所嵌入的 Applet 传递参数。 每个标记只能传递一个字符串型的参数。 例子:<HTML><BODY><APPLET code=“MyAppletParam.class” height=200 width=300><PARAM name=vstring value=“ 我是来自HTML 的参数”><PARAM name=x value=50><PARAM name=y value=100></BODY></HTML> ▼

Page 45: 第四章  Java 数组和工具类
Page 46: 第四章  Java 数组和工具类

4.5 4.5 异常处理 异常处理 异常( Exception )又称例外,是指程序执行过程中出现的不正常现象。任何一个程序都可能出现异常,如要打开的文件不存在、内存不够、数组访问越界等。 Java 作为一种面向对象语言,它设计了很多标准的异常处理类,采用 throw-catch (抛出 - 捕获)方式,捕获并处理异常。 Java 使异常处理标准化,使程序设计思路更清楚,理解更容易。本章将介绍异常处理方法。

Page 47: 第四章  Java 数组和工具类

4.5.1 Java4.5.1 Java 异常处理的特点 异常处理的特点 与传统的错误处理技术相比, Java 使用异常处理错误有以下优越性: 1 .隔离错误处理代码和常规代码▼

在传统的程序设计中,错误检测、报错和错误处理放在一起,从而经常导致代码产生许多复杂的分支,而 Java 的异常处理就可解决该问题。2 .在调用栈中传播错误 ▼

Java 的异常具有在方法调用栈中传播错误的功能,即可以向调用栈的上层方法传递异常,可以让调用栈的更上层的方法来捕获异常,做到只让关心错误的方法捕获它。

Page 48: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次 (一)异常类的层次 (一) 所有异常类都是 Throwable 类的子类, Throwable 属于 java.lang 包,在程序中不必使用 import 语句引入即可使用。 Exception 和 Error 是 Throwable 类的直接子类。 Exception 是程序中所有可能恢复的异常类的父类, RuntiemException 和 Non_RuntiemException 是 Exception的直接子类。 Error 由系统保留,包含链接或装载时出现的错误、以及和虚处理机相关的错误等。 Java 程序可以抛出系统定义好的异常类,也可以由用户自定义新的异常类,用户定义的异常类一般是 Throwable 类或其子类。

Page 49: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(二)异常类的层次(二)Object

Throwable

ExceptionError

RutimeException Non_RutimeException

Page 50: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(三)异常类的层次(三)1 .运行异常 运行异常是指 Java 程序在运行时发现的由 Java 运行系统引发的各种异常,其出现频率很高,检测运行异常的开销很大,所以编译器不要求捕获或声明运行异常。

常见的运行异常如下所示: ArithmeticException :算术运算中除数为零,而产生的异常。

ArrayIndexOutOfBoundsException :访问数组下标超界异常。

Page 51: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(四)异常类的层次(四) ArrayStoreException :进行写数组操作时,对象或数据类型不兼容,导致该异常。 ClassCastException :当试图把对象 A 转换为对象 B 时,如果对象 A既不是对象 B 的实例,又非对象 B 的子类,将产生该异常。 IllegalArgumentException :在方法的参数表中,如果参数无效,将产生异常。 IllegalThreadStateException :非法改变线程状态,如启动已执行线程,导致异常。 NegativeArraySizeException :当数组的长度是负数时,产生异常

Page 52: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(五)异常类的层次(五) NullPointerException : 试图访问空对象的变量、方法

或空数组的元素,产生的异常。 SecurityException : Applet试图执行被WWW浏览器

安全设置所禁止的操作,产生异常。 IncompatibleClassChangeException :当类的定义被

改变,而引用该类的其它类没有被重新编译,则产生该异常 。

OutOfMemoryException :表示“内存不足”异常。 NoClassDefException : Java 执行时找不到所引用的类,产生该异常。

Page 53: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(六)异常类的层次(六) IncompatibleTypeException :试图实例化一

个接口,产生该异常。 UnsatisfiedLinkException :所调用的方法是本地方法,但执行时无法连接这个函数,将产生该异常。

InternalException :是系统内部故障所导致的异常。

Page 54: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(七)异常类的层次(七)2 .非运行异常 非运行异常能在编译时检测到,是类 Non_RuntimeException 及其子类的实例,可通过 throws 语句抛出。Java 在其标准包 java.lang 、 java.util 、java.io 、 java.net 中定义的异常类都是非运行异常类。

Page 55: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(八)异常类的层次(八)java.lang 包中定义的异常: ClassNotFoundException :找不到类和界面。 CloneNoSupportException :对象引用了 Object 类的 Clone 方法,但没有实现 Cloneable 界面。 IllegalAccessException :试图去访问另一个包中的类的非 public 方法。 InstantiationException :使用 Class 类的 newInstance方法试图去创建类的实例时,由于指定的类为界面、抽象类、数组而不能创建。 InterruptedException :当一个线程正在等待时,另一个线程来中断这个线程。

Page 56: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(九)异常类的层次(九)java.io 包中定义的异常:

java.io.EOFException :在正常的输入操作完成之前遇到了文件结束。

java.io.FileNotFoundException :找不到指定的文件。

java.io.UTFDataFormatException :不能完成 Java 定义的 UTF 格式的字符串转换。

Page 57: 第四章  Java 数组和工具类

4.5.2 4.5.2 异常类的层次(十)异常类的层次(十)java.net 包中定义的异常:

java.net.ProtocolException :网络协议有错。 java.net.SocketException :不能正常完成 socket 操作。 java.net.UnknownHostException :网络 host名不能被解析为网络地址。 java.net.UnknownSeviceException :网络连接不能支持请求服务。

Page 58: 第四章  Java 数组和工具类

4.5.3 4.5.3 抛出异常 (一)抛出异常 (一) Java 通过使用 throws 语句指定异常类型并抛出异常,其格式如下:

public void readFile() throws IOException{ ...// 包含可能产生 IO 异常的语句}public void myfunc() throws MyException1,MyException2{ ...}

Page 59: 第四章  Java 数组和工具类

4.5.3 4.5.3 抛出异常 (二)抛出异常 (二)在 throws 语句中指定的异常类可以是实际抛出

异常类型的父类。为了确定需要抛出哪些异常方法有二:

一是通过经验,仔细查找所调用的方法可能产生的异常;

二是先不作任何声明,等待编译器报错,编译器将通报所有需要用 throws 语句抛出的异常。

Page 60: 第四章  Java 数组和工具类

4.5.3 4.5.3 抛出异常 (三)抛出异常 (三) 也可在语句块中用 throw 语句抛出异常(可以是用户定义的异常)。 这种方式应被定义在满足一定条件时执行。 例如:try{… If(满足条件 ) throw(new SelfDefException) …} …Catch(SelfDefException e) {…}…class SelfDefException extends Throwable {…}

Page 61: 第四章  Java 数组和工具类

4.5.4 4.5.4 异常处理 (一)异常处理 (一)当程序发生异常时,就会抛出一个异常,这个异常可以被程序捕获,进行相应处理。▼ 在这个结构中使用了三个关键字: try, catch, finally 。 try 后大括号中的程序段称为保护代码( protected code ),可能产生某种异常,在 try 的 {} 中不进行任何异常处理。 紧接 try 之后的是一系列 catch 语句,这才是处理异常的正确地方。

Page 62: 第四章  Java 数组和工具类

4.5.4 4.5.4 异常处理 (二)异常处理 (二)catch 与方法的定义相似,需要一个参数,该参数必须是 Throwable 类或其子类的一个对象或接口。

catch 的作用是当系统或应用程序抛出一个异常后,通过与 catch 的参数比较,如果相匹配,就执行 catch 方法中的异常处理程序段,否则与一下 catch继续进行相匹配的比较。

Page 63: 第四章  Java 数组和工具类

4.5.4 4.5.4 异常处理 (三)异常处理 (三) 相匹配的含义指符合下列三种情况之一:

被抛出的异常类与 catch 参数指定类是同一类被抛出的异常类是 catch 参数指定类的子类。 如果 catch 参数是一个接口,而被抛出的异常类实现了这个接口。

catch 检查匹配是顺序进行的,当程序中包含多条catch 语句时,如果 catch 安排的顺序不当,可能导致某些 catch 后的处理程序段永远不会被执行。

Page 64: 第四章  Java 数组和工具类

4.5.4 4.5.4 异常处理 (四)异常处理 (四) 例如下面的程序段:

catch (IOException e) { 异常处理 1;

}catch (FileNotFoundException e) {

异常处理 2;}

所以在使用 catch 语句时,应该清楚所有参数所属类的层次,以便正确安排 catch 语句的顺序。 如果出现这种错误, javac 编译器会发出错误信息: catch not reached 。

Page 65: 第四章  Java 数组和工具类

4.5.4 4.5.4 异常处理 (五)异常处理 (五)无论 try 是否抛出异常,还是某个 catch 进行了异常处理, finally 后的程序段总要被执行一次。唯一不被执行的情况是 try 或 catch 中执行了 System.exit() ,则程序立即中止。 在 try-catch-finally 这个编程结构中, catch 语句和 finally 语句是可选的,但至少使用其中一个语句。

Page 66: 第四章  Java 数组和工具类

4.5.54.5.5 嵌套的异常处理嵌套的异常处理 在 try-catch-finally 结构中,可以使用嵌套形式,即在捕获异常处理过程中,可以继续抛出异常。 在这种嵌套结构中,产生异常后,首先与最内层的 try-catch-finally 结构中的 catch 语句进行匹配比较。 如果没有相匹配的 catch 语句,该异常情况可以被抛出,让外层的 try-catch-finlly 的结构重复进行匹配检查。 这样从最内层到最外层,逐一检查匹配,直到找到一个匹配为止。 如果所有的 try-catch-finally 结构中都没有找到一个与异常匹配的 catch ,则 Java 系统会打印一个与该异常相关的信息并显示异常发生时的堆栈状态。