Java程序设计清华大学软件学院下课件_第1页
Java程序设计清华大学软件学院下课件_第2页
Java程序设计清华大学软件学院下课件_第3页
Java程序设计清华大学软件学院下课件_第4页
Java程序设计清华大学软件学院下课件_第5页
已阅读5页,还剩321页未读 继续免费阅读

下载本文档

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

文档简介

2022/11/181教材雍俊海.Java程序设计.北京:清华大学出版社,2008.2022/11/91教材雍俊海.Java程序设计.北京:2022/11/182辅助教材雍俊海.Java程序设计教程(第2版).北京:清华大学出版社,2007.2022/11/92辅助教材雍俊海.Java程序设计教程(2022/11/183习题集雍俊海.Java程序设计习题集(含参考答案).北京:清华大学出版社,2006.2022/11/93习题集雍俊海.Java程序设计习题集(2022/11/184参考文献本课件的参考文献与下列书的参考文献相同雍俊海.Java程序设计.北京:清华大学出版社,2008.雍俊海.Java程序设计教程(第2版).北京:清华大学出版社,2007.雍俊海.Java程序设计习题集(含参考答案).北京:清华大学出版社,2006.雍俊海.Java程序设计.北京:清华大学出版社,2004.2022/11/94参考文献本课件的参考文献与下列书的参考文2022/11/185第4章数组、字符串、向量与哈希表雍俊海(Jun-HaiYong)清华大学软件学院SchoolofSoftware,TsinghuaUniversity2022/11/95第4章数组、字符串、向量与哈希表雍俊海2022/11/186本章总体纲要数组字符串字符串缓冲区向量哈希表2022/11/96本章总体纲要数组2022/11/187数组由相同类型的若干项数据组成例如:publicstaticvoidmain(Stringargs[])其中args是String类型的数组占用连续的内存地址数组的静态性一旦创建就不能修改数组的长度类似于动态数组的类型类Vector长度可以变大或缩小2022/11/97数组由相同类型的若干项数据组成2022/11/188示例int[]c=new

int[12];c

是数组名如何获得数组的长度?c.length第一个数组元素的下标为0

使用数组可以通过数组名与下标每个数组元素类似于普通的变量c[0]=3;c[0]+=5;-4560721543-89062-3164537812c[1]c[2]c[4]c[3]c[5]c[6]c[7]c[8]c[9]c[10]c[11]c[0]c.length2022/11/98示例int[]c=newint2022/11/189下标有时也称为索引必须是整数或整数表达式,例如:c[11]示例:含有运算符的下标表达式:

if(x==3) t=(c[5-2]==c[3])&&(c[x]==c[3]);//t=true2022/11/99下标有时也称为索引2022/11/1810数组声明一维数组变量的声明格式有如下两种:(1) 数组元素的数据类型[]变量名;(2) 数组元素的数据类型变量名[];示例:int[]c;String[]names;intc[];Stringnames[];2022/11/910数组声明一维数组变量的声明格式有如下两2022/11/1811内存分配Java数组实际上也是对象,所以可通过new

关键字来创建示例:int[]c;

//声明c=

new

int[12];

//创建对象,并分配内存声明时不必指定数组的大小上面的两个语句可以简化成一个语句int[]c=new

int[12];2022/11/911内存分配Java数组实际上也是对象,所2022/11/1812初始化数组基本数据类型的元素初始化为0值或false非基本数据类型的元素初始化为null

可以采用循环结构初始化数组示例:double[]squares;squares=newdouble[100];for(inti=0;i<squares.length;i++){squares[i]=i*i;}2022/11/912初始化数组基本数据类型的元素初始化为02022/11/1813通过初始化语句创建数组Java语言允许通过数组的初始化语句创建数组示例:int[]n={10,20,30,40,50};上面语句创建了一个含有五个元素的数组下标值分别为0,1,2,3,4这时不需要运算符new2022/11/913通过初始化语句创建数组Java语言允许2022/11/1814注意事项当通过循环遍历数组时下标永远不要低于0下标永远要比数组元素个数小当数组下标出错,Java产生ArrayIndexOutOfBoundsException2022/11/914注意事项当通过循环遍历数组时2022/11/1815多维数组最常用的多维数组是二维数组

int[][]a=new

int[3][4];二维数组可以理解成如下图示的表格a[0][0]a[1][0]a[2][0]a[0][1]a[1][1]a[2][1]a[0][2]a[1][2]a[2][2]a[0][3]a[1][3]a[2][3]行的下标值列的下标值2022/11/915多维数组最常用的多维数组是二维数组a[2022/11/1816示例1类似于一维数组进行二维数组的声明、创建(内存分配)与初始化示例:classJ_FillArray{

publicstaticvoidmain(Stringargs[]){

int[][]matrix=newint[4][5];

for(introw=0;row<4;row++){

for(intcol=0;col<5;col++){matrix[row][col]=row+col;}//内部for循环结束

}//外部for循环结束

}//方法main结束}//类J_FillArray结束2022/11/916示例1类似于一维数组进行二维数组的声2022/11/1817示例2通过初始化语句创建数组示例:double[][]c={{1.0,2.0,3.0,4.0},{0.0,1.0,0.0,0.0},{0.0,0.0,1.0,0.0}};

2022/11/917示例2通过初始化语句创建数组2022/11/1818注意事项Java的多维数组实际上是数组的数组即创建以数组为元素的数组意味着:二维数组的每一行可以具有不同的列数示例:inta[][];a=newint[3][];//allocaterowsa[0]=newint[3];//allocaterow0a[1]=newint[2];//allocaterow1a.length–行数a[i].length–第i行列数2022/11/918注意事项Java的多维数组实际上是2022/11/1819三维数组思维的扩展:一维数组二维数组三维数组示例:classJ_Fill3DArray{

publicstaticvoidmain(Stringargs[]){

int[][][]M=newint[4][5][3];

for(introw=0;row<4;row++){

for(intcol=0;col<5;col++){

for(intver=0;ver<3;ver++){M[row][col][ver]=row+col+ver;}//内部for循环结束

}//for循环结束

}//外部for循环结束

}//方法main结束}//类J_Fill3DArray结束2022/11/919三维数组思维的扩展:一维数组二维数2022/11/1820注意事项Java允许数组的维数为:三、四、或更大但是,慎用高维数组甚至三维数组在实际的应用中也比较少出现2022/11/920注意事项Java允许数组的维数为:三2022/11/1821本章总体纲要数组字符串字符串缓冲区向量哈希表2022/11/921本章总体纲要数组2022/11/1822String的基本知识String与C语言不同:字符(char)数组不是字符串(String)String数值不必以'\u0000'结束StringaStringbStringcHelloWorld!2022/11/922String的基本知识StringSt2022/11/1823String直接量String直接量双引号括起来的字符序列示例:“Hello”

或“您好"字符串赋值可以在声明时赋值

String

c="blue";c是String类型的变量"blue"是String直接量2022/11/923String直接量String直接2022/11/1824String构造类String共有11个构造方法,其中两个不被赞成使用(deprecated)参见docs\index.html2022/11/924String构造类String2022/11/1825示例//J_StringConstructors.java;开发者:雍俊海//字符串构造方法例程publicclassJ_StringConstructors{

publicstaticvoidmain(Stringargs[]){Strings1=null;Strings2=newString();Strings3="您好!";Strings4=newString(s3);System.out.println("s1:"+s1);System.out.println("s2:"+s2);System.out.println("s3:"+s3);System.out.println("s4:"+s4);}//方法main结束}//类J_StringConstructors结束s1不指向任何字符串对象String构造方法:创建空字符串String构造方法:创建新字符串字符串直接量2022/11/925示例//J_StringConstr2022/11/1826String方法:

length(),charAt()和getChars()方法length()返回String

的长度与数组不同之处:Strings不含有length成员域方法charAt(intindex)获得字符串指定位置的字符方法getChars(intsrcBegin,intsrcEnd,char[]dst,intdstBegin)

拷贝字符串的部分字符序列到指定的字符数组的指定位置2022/11/926String方法:

length(2022/11/1827字符串比较字符串(String)比较字符类型的数据也是数值类型数据比较字符串大小,实际上就是依次比较其所包含的字符的数值大小小写字母与大小字母是不相同的2022/11/927字符串比较字符串(String)比较2022/11/1828==

运算符当用于基本数据类型时,用于判别是否相等当用于引用数据类型时,用来判别引用是否指向相同的对象Java虚拟机中含有字符串池(直接量在此池内),相同内容的字符串直接量相同的对象s1=“hello”;//字符串直接量s2=newString("hello");s1=="hello";//trues2=="hello";//false2022/11/928==运算符当用于基本数据类型时,用于2022/11/1829字符串(String)比较方法booleanequals(ObjectanObject)比较当前的字符串与指定的对象比较结果为真当且仅当给定的参数不为空,并且具有完全相同的字符序列例如:s1.equals("Hi");booleanequalsIgnoreCase(StringanotherString)判别相等,但不区分大小写例如:在不区分大小写情况下,“hello”与“HELLO”相等2022/11/929字符串(String)比较方法bool2022/11/1830字符串(String)比较方法intcompareTo(StringanotherString)

比较两个字符串的内容返回:0:如果字符串内容完全相同小于0的值:如果在比较第一个不相同字符,当前字符串的字符的值小于anotherString对应的字符的值大于0的值:如果在比较第一个不相同字符,当前字符串的字符的值大于anotherString对应的字符的值intcompareToIgnoreCase(Stringstr)

比较两个字符串的内容,但不区分大小写2022/11/930字符串(String)比较方法int2022/11/1831查找字符串中的字符或子串查找字符串(String)中的字符或子串方法indexOf四种重载方法indexOf返回第一次找到的时下标如果没有找到,则返回-1示例:Stringname="CoolTools";System.out.println(name.indexOf("oo"));2022/11/931查找字符串中的字符或子串查找字符串(S2022/11/1832查找字符串中的字符或子串方法lastIndexOf

publicintlastIndexOf(intch,intfromIndex)从指定位置往回查找,返回找到的最大的字符下标位置即返回满足下面条件的最大值:(this.charAt(k)==ch)&&(k<=fromIndex)返回-1:如果当前字符串不含该字符2022/11/932查找字符串中的字符或子串方法last2022/11/1833从当前字符串中抽取子字符串方法substringsubstring(intbeginIndex)

返回新的字符串:当前字符串的子串该子串从指定的位置开始,并一直到当前字符串结束为止substring(intbeginIndex,intendIndex)返回新的字符串:当前字符串的子串该子串从指定的位置(beginIndex)开始,到指定的位置(endIndex

-1)结束2022/11/933从当前字符串中抽取子字符串方法sub2022/11/1834字符串(String)拼接方法concat拼接两个字符串,并返回一个新字符串源字符串不会被修改s1.concat(s2)返回字符串s1和s2拼接的结果示例:Strings1="ABC";Strings2="XYZ";s1=s1.concat(s2);//s1=s1+s2;2022/11/934字符串(String)拼接方法con2022/11/1835类String的成员方法valueOf静态(static)成员方法valueOf将参数的值转化成相应的字符串valueOf(char[]data)

return

new

String(data);valueOf(char[]data,intoffset,intcount)return

newString(data,offset,count);其它valueOf方法的参数的类型:boolean、char、int、long、float、double和Object对象还可以通过方法toString转化成字符串2022/11/935类String的成员方法valueOf2022/11/1836其它String方法其它String方法s1.replace(char1,char2)返回一个新的字符串,它是将s1中的所有char1替换成的结果char2源字符串没有发生变化如果s1不含char1,则返回源字符串的引用,即s1示例:“mesquiteinyourcellar”.replace(‘e’,‘o’)

结果返回"mosquitoinyourcollar"“JonL”.replace(‘q’,‘x’)结果返回“JonL”(没有发生变化)2022/11/936其它String方法其它String方2022/11/1837其它String方法s1.toUpperCase返回对应的新字符串,各个字母都是大写的如果没有字符被修改,则返回源字符串的引用类似方法s1.toLowerCase练习:请试着分析方法toUpperCase是如何实现的?2022/11/937其它String方法s1.toUppe2022/11/1838其它String方法s1.trim()返回新字符串,源字符串最前面和最后面的的空白符如果字符串没有被改变,则返回源字符串的引用s1.toString()由于s1本身就是字符串了,所以返回s1本身其它引用类型也可以通过方法toString,生成相应的字符串s1.toCharArray()将字符串转换成字符数组2022/11/938其它String方法s1.trim(2022/11/1839其它String方法方法intern返回具有相同内容的字符串的引用如果字符串池含有该内容的字符串,则返回字符串池中具有该内容的字符串的引用如果字符串池没有字符串的内容与其相同,则在字符串池中创建具有该内容的字符串,再返回新创建的字符串的引用字符串池组成:字符串直接量以及由方法intern产生的字符串字符串池中的字符串s与t

:s与t具有相同内容(s.equals(t))当且仅当指向s与t的同一个字符串(ern()==ern())可以采用这个机制加速字符串是否相等的判定2022/11/939其它String方法方法intern2022/11/1840本章总体纲要数组字符串字符串缓冲区向量哈希表2022/11/940本章总体纲要数组2022/11/1841类StringBuffer类String字符串(String)对象一旦创建,其内容不能再被修改(read-only)类StringBufferStringBuffer

对象的内容是可以被修改的除了字符的长度之外,还有容量的概念通过动态改变容量的大小,加速字符管理2022/11/941类StringBuffer类Stri2022/11/1842三种StringBuffer构造方法buf1=new

StringBuffer();创建空的StringBuffer对象容量为16字符buf2=new

StringBuffer(capacity);创建空的StringBuffer对象指定容量大小buf3=newStringBuffer(myString);创建含有相应字符序列的StringBuffer对象容量为myString.length()+16示例:

StringBufferb=newStringBuffer("hello");2022/11/942三种StringBuffer构造方法2022/11/1843String和StringBufferString

和StringBuffer

是两种不同的类不能用字符串(String)的示例对象调用类(StringBuffer)的成员方法反之亦然String

StringBuffer构造方法StringBuffer

String构造方法方法toString()2022/11/943String和StringBuff2022/11/1844StringBuffer方法方法length()返回StringBuffer

的长度方法capacity()返回StringBuffer

的容量方法setLength(intnewLength)

增加或减小StringBuffer

的长度2022/11/944StringBuffer方法方法l2022/11/1845方法ensureCapacity(intminimumCapacity)参见在线帮且文档阅读方法ensureCapacity的切确含义确保StringBuffer对象的容量至少为指定的大小如果当前容量比指定值(minimumCapacity)小,则重新分配内存新容量大小为如下的值中较大者:参数minimumCapacity

的值.两倍的旧容量,再加上2.如果minimumCapacity的值比已有容量小,则不做任何操作,直接返回2022/11/945方法ensureCapacity(2022/11/1846处理StringBuffer内字符的方法方法charAt(intindex)

返回StringBuffer

对象中指定位置的字符方法setCharAt(intindex,charch)

设置StringBuffer对象中指定位置的字符方法getChars(intsrcBegin,intsrcEnd,

char[]dst,intdstBegin)

将StringBuffer对象中指定的字符子序列,拷贝到指定的字符数组(dst)方法reverse()将StringBuffer

对象中的字符序列按逆序方式排列2022/11/946处理StringBuffer内字符的方2022/11/184711种append

方法允许数值类型的值添加到StringBuffer对象中示例:publicStringreverseIt(Stringsource){

intc;len=source.length();

StringBufferdest=newStringBuffer(len);

for(c=(len-1);c>=0;c--){dest.append(source.charAt(c));}

returndest.toString();}2022/11/94711种append方法允许数值类2022/11/1848insert

和delete

方法方法insert允许将各种数据插到StringBuffer对象的指定位置方法delete(intstart,intend)

和deleteCharAt(intindex)

允许删除StringBuffer对象中的指定字符2022/11/948insert和delete方法方2022/11/1849本章总体纲要数组字符串字符串缓冲区向量哈希表2022/11/949本章总体纲要数组2022/11/1850向量向量所对应的类是类java.util.Vector向量变量的声明格式Vector<向量元素的数据类型>变量名;示例Vector<String>vs;2022/11/950向量向量所对应的类是类java.uti2022/11/1851创建向量实例对象Vector<String>vs=newVector<String>();Vector<Object>vo=newVector<Object>();2022/11/951创建向量实例对象Vector<Stri2022/11/1852增加元素publicbooleanadd(Eo)publicvoidaddElement(Eobj)示例vs.add("Tom");2022/11/952增加元素publicboolean2022/11/1853修改元素publicEset(intindex,Eelement)publicvoidsetElementAt(Eobj,intindex)2022/11/953修改元素publicEset(in2022/11/1854删除元素publicvoidclear()publicvoidremoveAllElements()publicEremove(intindex)publicvoidremoveElementAt(intindex)2022/11/954删除元素publicvoidcle2022/11/1855通过迭代器(iterator)获取向量对象的各个元素类java.util.Vector的成员方法publicIterator<E>iterator()接口java.util.Iterator的成员方法booleanhasNext()接口java.util.Iterator的成员方法Enext()2022/11/955通过迭代器(iterator)获取向量2022/11/1856本章总体纲要数组字符串字符串缓冲区向量哈希表2022/11/956本章总体纲要数组2022/11/1857哈希函数或散列函数示例h1(s)=s[0]*31(n-1)+s[1]*31(n-2)+......+s[n-1]哈希码(hashcode)或散列索引由哈希函数计算出来的数值2022/11/957哈希函数或散列函数示例2022/11/1858哈希表的空间利用率哈希表的容量(capacity)哈希表的存储空间大小哈希表的装填因子2022/11/958哈希表的空间利用率哈希表的容量(cap2022/11/1859哈希表类java.util.Hashtable2022/11/959哈希表类java.util.Hasht2022/11/1860示例//J_Hashtable.java;开发者:雍俊海//通过哈希表形成数组下标与值之间的双向映射。import

java.util.Hashtable;publicclassJ_Hashtable{

publicstaticvoidmain(Stringargs[]){String[]sa={"Mary","Tom","John","James","Louis","Jim","Rose","Ann","Liza","Betty","Henry","Albert"};Hashtable<String,Integer>ht=newHashtable<String,Integer>();2022/11/960示例//J_Hashtable.ja2022/11/1861示例

//往哈希表中添加元素,并使得关键字与值之间建立起映射关系

int

i;

for(i=0;i<sa.length;i++)ht.put(sa[i],newInteger(i));

//通过下标获得姓名(字符串值)i=8;System.out.println("在sa数组中,下标为"+i+"的字符串是\""+sa[i]+"\"");

//通过哈希表,直接获得姓名(字符串值)的数组下标Strings=sa[i];System.out.println("在sa数组中,\""+s+"\"的下标是"+ht.get(s));}//方法main结束}//类J_Hashtable结束2022/11/961示例//往哈希表中添2022/11/1862编译,运行&输出2022/11/962编译,运行&输出2022/11/1863作业教材习题4.52022/11/963作业教材习题4.52022/11/1864本课件使用要求使用本课件,必须注明引用(具体见下一个幻灯片)书及课件均可能出现一些错误和缺陷,恳切希望广大读者特别是讲授此课程的老师批评指正2022/11/964本课件使用要求使用本课件,必须注明引用2022/11/1865引用声明本课件来源于(或参考了)下面的书及其课件:雍俊海.《Java程序设计》.北京:清华大学出版社,2008.2022/11/965引用声明本课件来源于(或参考了)下面的2022/11/1866免责声明请合法使用课件,其用途应当合法有益而且不应对任何人造成任何伤害或损失同时请注意教材作者及出版社没有对本课件做出任何承诺与保证2022/11/966免责声明请合法使用课件,其用途应当合法2022/11/1867参考文献本课件的参考文献与下列书的参考文献相同雍俊海.Java程序设计.北京:清华大学出版社,2008.雍俊海.Java程序设计教程(第2版).北京:清华大学出版社,2007.雍俊海.Java程序设计习题集(含参考答案).北京:清华大学出版社,2006.雍俊海.Java程序设计.北京:清华大学出版社,2004.2022/11/967参考文献本课件的参考文献与下列书的参考2022/11/1868谢谢请多指教2022/11/968谢谢请多指教2022/11/1869第5章泛型和枚举雍俊海(Jun-HaiYong)清华大学软件学院SchoolofSoftware,TsinghuaUniversity2022/11/969第5章泛型和枚举雍俊海(Jun2022/11/1870本章总体纲要泛型枚举2022/11/970本章总体纲要泛型2022/11/1871定义格式类[类修饰词列表]

class

类名

<类型参数列表>

[extends

父类名]

[implements

接口名称列表]{

类体}接口[接口修饰词列表]

interface

接口名<类型参数列表>

[extends

接口名称列表]{

接口体}2022/11/971定义格式类2022/11/1872类型参数的定义格式类型变量标识符类型变量标识符

extends

父类型类型变量标识符

extends父类型1

&

父类型2

&......&

父类型n2022/11/972类型参数的定义格式类型变量标识符2022/11/1873示例//J_Add.java;开发者:雍俊海//泛型例程publicclassJ_Add<T>{

publicStringmb_sum(Ta1,Ta2,Ta3){

return(a1.toString()+a2.toString()+a3.toString());}//方法mb_sum结束

publicstaticvoidmain(Stringargs[]){J_Add<Integer>b=newJ_Add<Integer>();Integera1=newInteger(1);Integera2=newInteger(2);Integera3=newInteger(3);System.out.println(b.mb_sum(a1,a2,a3));}//方法main结束}//类J_Add结束2022/11/973示例//J_Add.java;开发2022/11/1874编译、运行&结果2022/11/974编译、运行&结果2022/11/1875示例//J_AddInterface.java;开发者:雍俊海//泛型例程interfaceJ_Interface<TextendsNumber>{

publicintmb_sum(Ta1,Ta2,Ta3);}//接口J_Interface结束publicclassJ_AddInterface<TextendsNumber>

implementsJ_Interface<T>{

publicintmb_sum(Ta1,Ta2,Ta3){intb1=Value();intb2=Value();intb3=Value();

return(b1+b2+b3);}//方法mb_sum结束2022/11/975示例//J_AddInterface2022/11/1876示例

publicstaticvoid

main(Stringargs[]){J_AddInterface<Integer>b=newJ_AddInterface<Integer>();Integera1=newInteger(1);Integera2=newInteger(2);Integera3=newInteger(3);System.out.println(b.mb_sum(a1,a2,a3));}//方法main结束}//类J_AddInterface结束2022/11/976示例publicstatic2022/11/1877编译、运行&结果2022/11/977编译、运行&结果2022/11/1878本章总体纲要泛型枚举2022/11/978本章总体纲要泛型2022/11/1879枚举的基本定义格式[枚举类型修饰词列表]

enum

枚举类型标识符{

枚举常量1,枚举常量2,......,枚举常量n}2022/11/979枚举的基本定义格式[枚举类型修饰词列表2022/11/1880示例enumE_SEASON{

春季,夏季,秋季,冬季}//枚举E_SEASON结束2022/11/980示例enumE_SEASON2022/11/1881示例//J_Enum.java;开发者:雍俊海//枚举例程enum

E_SEASON{春季,夏季,秋季,冬季}//枚举E_SEASON结束publicclassJ_Enum{

publicstaticvoidmain(Stringargs[]){E_SEASON[]sa=E_SEASON.values();

for(inti=0;i<sa.length;i++){2022/11/981示例//J_Enum.java;开2022/11/1882示例

switch(sa[i]){

case春季:System.out.println("春季花满天");

break;

case夏季:System.out.println("夏季热无边");

break;

case秋季:System.out.println("秋季果累累");

break;

case冬季:System.out.println("冬季雪皑皑");

break;}//switch结构结束}//for循环结束}//方法main结束}//类J_Enum结束2022/11/982示例switc2022/11/1883编译、运行&结果2022/11/983编译、运行&结果2022/11/1884作业习题5.2习题5.32022/11/984作业习题5.22022/11/1885本课件使用要求使用本课件,必须注明引用(具体见下一个幻灯片)书及课件均可能出现一些错误和缺陷,恳切希望广大读者特别是讲授此课程的老师批评指正2022/11/985本课件使用要求使用本课件,必须注明引用2022/11/1886引用声明本课件来源于(或参考了)下面的书及其课件:雍俊海.《Java程序设计》.北京:清华大学出版社,2008.2022/11/986引用声明本课件来源于(或参考了)下面的2022/11/1887免责声明请合法使用课件,其用途应当合法有益而且不应对任何人造成任何伤害或损失同时请注意教材作者及出版社没有对本课件做出任何承诺与保证2022/11/987免责声明请合法使用课件,其用途应当合法2022/11/1888参考文献本课件的参考文献与下列书的参考文献相同雍俊海.Java程序设计.北京:清华大学出版社,2008.雍俊海.Java程序设计教程(第2版).北京:清华大学出版社,2007.雍俊海.Java程序设计习题集(含参考答案).北京:清华大学出版社,2006.雍俊海.Java程序设计.北京:清华大学出版社,2004.2022/11/988参考文献本课件的参考文献与下列书的参考2022/11/1889谢谢请多指教2022/11/989谢谢请多指教2022/11/1890第6章异常处理雍俊海(Jun-HaiYong)清华大学软件学院SchoolofSoftware,TsinghuaUniversity2022/11/990第6章异常处理雍俊海(Jun-2022/11/1891Java异常处理(Exception)基础异常(Exception)?异常(Exception)是正常程序流程所不能处理或没有处理的异常情况或异常事件。在有些书中,异常也称作例外。2022/11/991Java异常处理(Exception2022/11/1892格式在try语句块中包含可能会产生异常的语句紧接着若干个catch语句块,进行异常处理catch语句块与finally语句块至少存在一个try{

//可能会抛出异常的代码}catch(ExceptionTyperef){

//异常处理代码

}finally{

//…}2022/11/992格式在try语句块中包含可能会产生异常2022/11/1893为什么需要异常?强制程序异常/错误处理同时指定需要异常的种类异常处理模型提供了一种统一处理异常/错误的模式传统程序方法:设置标志位,或返回错误码,分别处理各种异常情况。但在编程时常常出现这样的情况:忘了对某些异常情况进行处理,尤其是当存在多个分支或者多个开发人员共同开发程序时。简化对异常情况的处理,减少if-else语句2022/11/993为什么需要异常?强制程序异常/错误处理2022/11/1894什么时候会发生异常?数组的下标越界打开不存在的文件网络无法连接操作数超出所要求的范围少了所需加载的类,自定义异常,要求程序处理2022/11/994什么时候会发生异常?数组的下标越界2022/11/1895处理异常的几种常用方法一旦捕获异常,马上进行处理重新抛出异常捕获异常,但并不处理通过语句System.exit()退出应用程序2022/11/995处理异常的几种常用方法一旦捕获异常,马2022/11/1896异常(Exceptions)类型常见异常内存耗尽数组下标越界除数为0非法的参数(方法的参数)2022/11/996异常(Exceptions)类型常见异2022/11/1897异常(Exception)的层次结构2022/11/997异常(Exception)的层次结构2022/11/1898运行时发生的异常(RuntimeExceptions)异常随时都可以发生ArrayIndexOutOfBoundsExceptionNullPointerException定义了引用,但不指向任何对象(object)ClassCastException数据类型间的转换不合法良好的编程习惯,可以减少很多异常的发生2022/11/998运行时发生的异常(RuntimeExc2022/11/1899受检异常和非受检异常受检异常必须在方法声明时通过throws列出在编译时就能被检测出非受检测异常不必在throws列表中错误(Errors)和运行时异常(RuntimeExceptions)受检异常,必须处理才能通过编译运行时异常只有在运行时才能被发现错误常常指的是致命性错误,常常也无法处理2022/11/999受检异常和非受检异常受检异常2022/11/18100处理多种异常(Exception)类型如果含有多外catch语句块,则异常会被第一个与其相匹配的catch语句块处理2022/11/9100处理多种异常(Exception)类2022/11/18101finally

语句块在异常处理过程中,finally

语句块总是会被执行到:无论有没有异常发生,也无论有没有异常被捕捉到可选项:finally

语句块,通常位于catch

语句块的后面可以用来释放try语句块中获得的资源例如,关闭在try语句块中打开的文件2022/11/9101finally语句块在异常处理过程2022/11/18102throws

列表在方法的声明处列出所有的受检异常返回类型

方法名(参数列表

)throws

异常类型1,异常类型2,…{//方法体}在本方法内就可以不处理这些异常调用该方法的方法就必须处理这些异常示例:publicstaticvoidg()throwsException{

thrownewException();}//方法g结束2022/11/9102throws列表在方法的声明处列出2022/11/18103异常处理:捕捉-或者-声明如果一个方法调用一个抛出受检异常的方法(含有throws列表的方法),则该方法必须捕捉这些受检异常,或通过throws列表声明这些异常2022/11/9103异常处理:捕捉-或者-声明如果一个2022/11/18104重新抛出异常如果catch语句块不处理某种异常,可以重新抛出异常抛出异常的方法:

throwe;由其外层的try-catch

语句块处理2022/11/9104重新抛出异常如果catch语句块不处2022/11/18105作业习题6.2习题6.32022/11/9105作业习题6.22022/11/18106本课件使用要求使用本课件,必须注明引用(具体见下一个幻灯片)书及课件均可能出现一些错误和缺陷,恳切希望广大读者特别是讲授此课程的老师批评指正2022/11/9106本课件使用要求使用本课件,必须注明引2022/11/18107引用声明本课件来源于(或参考了)下面的书及其课件:雍俊海.《Java程序设计》.北京:清华大学出版社,2008.2022/11/9107引用声明本课件来源于(或参考了)下面2022/11/18108免责声明请合法使用课件,其用途应当合法有益而且不应对任何人造成任何伤害或损失同时请注意教材作者及出版社没有对本课件做出任何承诺与保证2022/11/9108免责声明请合法使用课件,其用途应当合2022/11/18109参考文献本课件的参考文献与下列书的参考文献相同雍俊海.Java程序设计.北京:清华大学出版社,2008.雍俊海.Java程序设计教程(第2版).北京:清华大学出版社,2007.雍俊海.Java程序设计习题集(含参考答案).北京:清华大学出版社,2006.雍俊海.Java程序设计.北京:清华大学出版社,2004.2022/11/9109参考文献本课件的参考文献与下列书的参2022/11/18110谢谢请多指教2022/11/9110谢谢请多指教2022/11/18111第7章文件与数据流雍俊海(Jun-HaiYong)清华大学软件学院SchoolofSoftware,TsinghuaUniversity2022/11/9111第7章文件与数据流雍俊海(J2022/11/18112本章总体纲要输入流与输出流随机访问文件读写器文件类File2022/11/9112本章总体纲要输入流与输出流2022/11/18113文件与数据流简介包java.io

含有进行I/O处理的各种类两个主要数据类 输入:java.io.InputStream

输出:java.io.OutputStream两个主要的读写器类:

读入:java.io.Reader

写出:java.io.Writer.2022/11/9113文件与数据流简介包java.io2022/11/18114什么是数据流?数据流是一系列的数据例如:System.in、System.out或System.err

所处理的对象是数据流System.in-标准输入(从键盘)System.out–标准输出(到屏幕)System.err–标准错误输出(到屏幕)可以重新定向(例如:将从键盘改为从数据文件)2022/11/9114什么是数据流?数据流是一系列的数据2022/11/18115处理数据流的核心思想处理数据流的核心思想能过循环处理每个数据单元,直到遇到结束符或出现异常(Exception)结束符在Unix操作系统下,键入Control-D表示数据流的结束在Windows操作系统下,键入Control-Z表示数据流的结束2022/11/9115处理数据流的核心思想处理数据流的核心2022/11/18116什么是文件?文件可以用来长期保存大量的数据在程序结束后仍能长期(永久)存在文件一般位于副存储设备上硬盘光盘磁带保存在变量或数组中的数据是临时性数据当程序结束时一般就会丢失2022/11/9116什么是文件?文件2022/11/18117Java文件中的结构Java数据流无其它结构文件本身没有“记录”的概念程序员根据实际应用的需要指定文件的结构2022/11/9117Java文件中的结构Java数据流2022/11/18118类InputStream类java.io.InputStream是一个抽象(abstract)类,声明了从原始字节数据流读入数据的基本方法类中声明的方法:publicabstractintread()throwsIOExceptionpublicintread(byte[]data)throwsIOExceptionpublicintread(byte[]data,intoffset,intlength)throwsIOExceptionpubliclongskip(longn)throwsIOExceptionpublicintavailable()throwsIOExceptionpublicvoidclose()throwsIOExceptionpublicvoidmark(intreadlimit)publicvoidreset()throwsIOExceptionpublicbooleanmarkSupported()2022/11/9118类InputStream类java2022/11/18119以字节为单位读入数据类InputStream的成员方法read()读入单个无符号字节(unsignedbyte)的数据,并返回一个整数类型(int)的值(与读入的无符号字节数据相对应)正常返回:介于0和255之间的一个数如果遇到数据流结束,则返回-1publicabstractintread()throwsIOException

2022/11/9119以字节为单位读入数据类InputSt2022/11/18120方法read()下面的两个方法可以一次读入多个字节到数组中java.io.InputStreampublicintread(byte[]data)throws

IOException

publicintread(byte[]data,intoffset,intlength)throwsIOException

2022/11/9120方法read()下面的两个方法可2022/11/18121计算可读入的字节方法available()给出可以读入的字节数这样在读数据之前就知道可以读入的字节数java.io.InputStreampublicintavailable()throwsIOException2022/11/9121计算可读入的字节方法availab2022/11/18122关闭数据流当处理完数据流时,应当关闭该数据流,以便释放该数据流所关联的资源publicvoidclose()throwsIOException2022/11/9122关闭数据流当处理完数据流时,应当关闭2022/11/18123输出流与InputStream相似,OutputStream

也是abstract

类类中的成员方法:publicabstractvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]data)throwsIOExceptionpublicvoidwrite(byte[]data,intoffset,intlength)throwsIOExceptionpublicvoidflush()throwsIOExceptionpublicvoidclose()throwsIOException

有时输出流会先输出到缓存中,最后再一起将数据写到指定的位置(如文件)。方法flush()可以强制进行输出,即强制将数据写到指定的位置(如文件/标准输出)2022/11/9123输出流与InputStream相似2022/11/18124Print数据流类java.io.PrintStream

是类FilterOutputStream的子类示例:System.out

和System.err类PrintStream

的实例对象不会抛出(throws)异常(IOException)这个类“吃掉”(traps)所有的异常(IOExceptions)2022/11/9124Print数据流类java.io2022/11/18125Print数据流java.lang.Object|+--java.io.OutputStream|+--java.io.FilterOutputStream|+--java.io.PrintStream2022/11/9125Print数据流java.lang2022/11/18126标准数据流java.lang.Object|+--java.lang.SystemstaticPrintStream

err

标准错误输出流staticInputStream

in

标准输入流staticPrintStream

out

标准输出流2022/11/9126标准数据流java.lang.Obj2022/11/18127文件与数据流包java.io中含有对文件进行处理的类FileInputStream

以字节为单位从文件中输入数据FileOutputStream以字节为单位输出数据到文件中FileReader

以字符为单位读取文件数据FileWriter以字符为单位写数据到文件中随机访问文件RandomAccessFile2022/11/9127文件与数据流包java.io中含有对2022/11/18128从文件中输入类java.io.FileInputStream

表示从文件中输入字节数据的输入流(InputStream)类中的成员方法:publicFileInputStream(Stringname)throwsFileNotFoundExceptionpublicFileInputStream(Filefile)throwsFileNotFoundExceptionpublicFileInputStream(FileDescriptorfdObj)publicnativeintread()throwsIOExceptionpublicintread(byte[]data)throwsIOExceptionpublicintread(byte[]data,intoffset,intlength)throwsIOExceptionpublicnativelongskip(longn)throwsIOExceptionpublicnativeintavailable()throwsIOExceptionpublicnativevoidclose()throwsIOExceptionpublicfinalFileDescriptorgetFD()throwsIOException2022/11/9128从文件中输入类java.io.Fil2022/11/18129写数据到文件中类java.io.FileOutputStream表示将字节数据写入到文件中的输出流(OutputStream)类中的成员方法:publicFileOutputStream(Stringname)throwsIOExceptionpublicFileOutputStream(Stringname,booleanappend)throwsIOExceptionpublicFileOutputStream(Filefile)throwsIOExceptionpublicFileOutputStream(FileDescriptorfdObj)publicnativevoidwrite(intb)throwsIOExceptionpublicvoidwrite(byte[]data)throwsIOExceptionpublicvoidwrite(byte[]data,intoffset,intlength)throwsIOExceptionpublicnativevoidclose()throwsIOExceptionpublicfinalFileDescriptorgetFD()throwsIOException2022/11/9129写数据到文件中类java.io.Fi2022/11/18130Data(数据)输入/输出流类类java.io.DataInputStream

和类java.io.DataOutputStream

提供读取和写出基本数据类型也字符串类型(String)的数据读写方式具有机器(平台)无关性通常运用类DataInputStream

读取运用类DataOutputStream写出的数据2022/11/9130Data(数据)输入/输出流类类j2022/11/18131类DataOutputStream中的方

温馨提示

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

评论

0/150

提交评论