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

第四章 Java 数组和工具类

  • Upload
    stasia

  • View
    78

  • Download
    7

Embed Size (px)

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

Citation preview

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 系统会打印一个与该异常相关的信息并显示异常发生时的堆栈状态。