第8章 Java高级编程pptConvertor.docx
- 文档编号:28955330
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:21
- 大小:25.48KB
第8章 Java高级编程pptConvertor.docx
《第8章 Java高级编程pptConvertor.docx》由会员分享,可在线阅读,更多相关《第8章 Java高级编程pptConvertor.docx(21页珍藏版)》请在冰豆网上搜索。
第8章Java高级编程pptConvertor
第8章Java高级编程
主要内容:
异常处理机制
多线程编程
IO编程
网络编程
重点:
IO编程与网络编程
8.1异常处理
Java提供一套完善的异常处理机制,运行它可以提供程序的健壮性。
健壮的程序能在遇到异常情况下采取解决措施,而不健壮的程序则在此时会终止,或返回错误的结果,而且难以检测出异常的原因。
Throwable类
Exception类
Error类
RuntimeException
AWTException
IOException
IllegalAccessException
ClassNotFoundException
InterrruptedException
…
…
…
…
图8-1Throwable类的继承结构
异常类
异常类结构
所有异常类的祖先是java.lang.Throwable类。
Exception类和Error类都是Throwable类的子类。
Error类:
表示仅靠程序本身无法恢复的错误,由JVM抛出并处理。
Exception类:
表示程序本身可以处理的异常。
一般我们讲的异常就是指这一类。
Exception类分为运行时异常和受检查异常。
运行时异常:
RuntimeException类及其子类。
特点:
Java编译器不检查。
如:
除数为0时出现的ArithmeticException。
见下表
受检查异常:
除运行时异常以外所有异常。
特点:
Java编译器会检查。
运行异常
系统定义的运行异常通常对应于系统运行错误,如表8-1所示。
表8-1系统定义的运行异常
系统定义的运行异常对应的运行错误
ClassNotFoundException未找到欲装载的类
ArrayIndexOutOfBoundsException数组越界使用
FileNotFoundException未找到指定的文件或目录
IOException输入输出错误
NullPointerException引用尚未创建的对象
ArithmeticException算术错误,如除数为0
InterruptedException线程在睡眠、等待等被其他线程打断
UnknownHostException无法确定主机的IP地址
SecurityException安全性错误,如Applet欲读写文件
MalfoRMEDurlExceptionURL格式错误
3.用户自定义的异常
作用:
用来处理用户程序中特定的逻辑运行错误。
优点:
以程序内建的方式统一处理错误(对照老方法);
《例》为“从空队列出队”的逻辑错误定义异常:
classEmptyQueueExceptionextendsException
{
QueuesourceQueue;
publicEmptyQueueException(Queueq)
{
super(“队列已空”);
sourceQueue=q;
}
publicStringtoString()
{
return(“队列”+sourceQueue.toString()+“已空,出队引发异常”;
}}
在老方法里,在出队方法里,如果队列为空,则返回一个-1,表示出队操作失败。
这样队列中就不能存储-1这个数据,而且调用者要了解这个出错约定。
现在就用EmptyQueueException来代替-1,表示这个异常。
抛出异常
系统自动抛出的异常(系统自己定义的)
例8-1:
TestSystemException.java
语句抛出的异常
intdequeue()throwsEmptyQueueException
{……
if(isEmpty())
throw(newEmptyQueueException(this));
else{……}
}
见例子8-2:
TestQueueException.java
异常机制概述
把各种不同的异常情况进行分类,这种类称为异常类,可以发挥类的可扩展性和重用性的优势。
异常流程的代码和正常流程的代码分离,提高了代码的可读性,简化了程序的结构。
可以灵活处理异常。
有能力处理的就捕获并处理它,否则抛出异常,由方法调用者来处理。
异常处理机制
try…catch语句:
捕获异常
finally语句:
任何情况下都必须执行的代码
throws子句:
声明可能会出现的异常:
如果一个方法可能会出现异常,则方法声明处用该子句声明抛出异常。
如:
publicvoidrun()throwsException
throw语句:
抛出异常,如:
publicvoidrun()throwsException{
if(车子无法刹车)
thrownewException(“车子无法刹车”);
}
多异常的处理
一个try块可能产生多种不同的异常,如需要以不同的方法来处理,就需要多异常处理机制。
特点:
一个try块后跟多个catch块,每个catch块的参数不同。
流程:
当try块抛出异常时,程序转向第一个catch块,看参数类型是否匹配,能否被其接收。
匹配的条件:
异常对象与参数属于相同的例外类
异常对象属于参数例外类的子类
异常对象实现了参数所定义的接口。
见例子8-3:
TestMultiException.java
使用JApplet实现某一门课程的分数录入系统,界面包括学号、姓名、班号、成绩的输入域和一个录入按钮。
当用户单击录入按钮时,程序检查各输入域中是否有非空的数据,如有空域则抛出一个Exception对象;同时程序检查成绩输入域,如果不是数值信息或是负的数值信息,也抛出相应的异常。
抛出的异常应提供详细的信息说明,从而使使用该程序的用户了解所出现的问题,同时思考上述异常出现时程序应该如何处理。
见ExceptionExample.java
8.2Java多线程机制
线程的概念
创建和启动线程
线程的调度
多个线程的同步
线程之间的通信
8.2.1Java中的线程
程序、进程与线程
进程:
程序的一次动态执行过程,每一个进程都有自己独立的内存空间。
对一个应用程序可以同时启动多个进程。
线程:
比进程更小的执行单位。
一个进程可以产生多个线程,它们分别执行不同的任务。
当进程内的多个线程同时运行,则称为并发运行。
线程间可以共享存储单元,实现信息交换、实时通信与同步操作。
线程的创建和启动
定义一个Thread类的子类,覆盖Thread类的run()方法,然后创建该子类的实例。
定义一个实现Runnable接口的类,实现它的run()方法,然后将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例。
调用start()方法启动线程。
8.2.2Java的线程类与Runnable接口
Runnable接口
实现该接口的类必须实现该接口的Run()方法。
实质定义了一个除主线程之外的新线程的操作。
Thraed类
(1)构造函数
publicThread():
创建系统线程类对象。
publicThread(Runnabletarget):
创建线程类对象,并利用参数对象的run()方法进行初始化或覆盖新建线程的同名方法。
publicThread(StringThreadName):
创建一个具有指定名称的线程类对象。
publicThread(Runnabletarget,StringThreadName):
综合上述功能。
线程的状态与生命周期
程序的缺省主线程
应用程序:
main()方法的执行线程
Applet:
指挥浏览器加载并执行小程序的线程
多线程的实现
在主线程中创建新的线程对象(Thread类或其子类的对象)。
新建
就绪
阻塞
运行
死亡
线程生命周期经历的5种状态:
(1)新建:
声明并创建Thread类或其子类对象。
(2)就绪:
新建线程启动后进入线程队列等待CPU时间片,或阻塞线程被解除阻塞,都处于就绪状态。
(3)运行:
线程被调度并获得处理器资源,便自动调用本对象的run()方法进入运行状态。
(4)阻塞:
线程被人为挂起或需执行费时的输入输出时,让出CPU并暂时中止执行。
(5)死亡:
线程完成正常运行或通过stop()或destroy()方法被强制终止。
图8-3线程的生命周期
线程调度管理器负责管理线程排队和处理器资源在线程间的分配。
一般通过线程调度算法自动为各线程分配优先级。
Thread类有与优先级相关的静态常量:
MIN_PRIORITY1
MAX_PRIORITY10
NORM_PRIORITY5
系统为新建线程指定优先级的原则:
1)新线程继承创建它的父线程的优先级;
2)主线程一般具有普通优先级。
线程调度与优先级
线程的主要方法:
start():
启动线程,使之进入就绪状态。
run():
定义线程要执行的主体,由系统自动调用。
sleep(intmillsecond):
使线程暂时休眠,让出处理器。
isAlive():
判断线程是否消亡。
setPriority(intp):
设置或修改线程优先级。
你必须确保你的代码中的线程会不时地给另一个线程运行的机会。
可以有以下方法:
位于运行状态的线程调用Thread.sleep()方法。
位于运行状态的线程调用Thread.yield()方法。
位于运行状态的线程调用另一个线程的join()方法。
线程睡眠:
Thread.sleep()方法,见ch8\8.2.3\machine.java。
线程让步:
Thread.yield()方法,把上面的示例中sleep()改成yield()方法。
等待其他线程结束:
join()方法,见ch8\8.2.3\join\machine.java。
publicclassMachineextendsThread{
publicvoidrun(){
for(inta=0;a<50;a++){
System.out.println(currentThread().getName()+":
"+a);
try{
sleep(100);//给其他线程运行的机会
}catch(InterruptedExceptione){thrownewRuntimeException(e);}
}
}
publicstaticvoidmain(Stringargs[]){
Machinemachine1=newMachine();//创建第一个Machine对象
Machinemachine2=newMachine();//创建第二个Machine对象
machine1.start();//启动第一个Machine线程
machine2.start();//启动第二个Machine线程
}
}
8.2.3如何在程序中实现多线程
创建Thread类的子类
publicclassMyRunnableimplementsRunnable{
publicvoidrun(){
inta=0;
for(a=0;a<10;a++){
try{Thread.sleep(100);}
catch(Exceptione){}
System.out.println(Thread.currentThread().getName()+”“+a);
}
}
publicstaticvoidmain(Stringargs[]){
MyRunnablemr=newMyRunnable();
Threadr1=newThread(mr);
Threadr2=newThread(mr);
t1.start();
t2.start();
}
}
《例8-5》UseRunnable.java
实现Runnable接口
用户类通过实现Runnable接口的run()方法定义用户线程的操作。
以该类为参数创建Thread对象,就可继承该方法。
Thread.isAlive():
指如果线程已经启动且尚未终止,则为活动状态。
8.3流式输入输出与文件处理
8.3.1Java输入输出类库
流的概念
流:
在计算机输入输出之间流动的数据序列。
流式输入输出的特点:
数据的获取和发送均沿数据序列顺序进行。
Java的io包中有不同的流类对应性质不同的io流。
当Java程序需要从外设中读入、写出数据时,它应该创建一个合适的流类对象,完成与外设的连接;然后再调用该对象的read()/write()方法,实现io操作。
输入输出流类
(1)基本输入输出流类—具有最基本的输入输出功能的抽象类,不能实例化
1)InputStream类
包含所有输入流都需要的方法,可完成最基本的从输入流读入数据的功能。
从输入流读入数据(只能以二进制形式读入):
publicintread():
从当前位置读入一个0到255范围内的int字节值返回。
publicintread(byteb[]):
从当前位置处连续读入多个字节,保存在字节数组b[]中,并返回所读到的字节数。
Stream与reader/writer是用来数据的传递与文件内容的修改(访问);
File类是用来处理文件的属性与文件的目录,不修改(访问)文件内容;
定位输入位置指针:
publiclongskip(longn):
从当前位置向后跳过n个字节
publicvoidmark():
在当前位置处做标记
publicvoidreset():
将位置指针返回到标记的位置
关闭流(断开与外设的连接,释放所占用资源):
publicvoidclose();
2)OutputStream类
包含所有输出流都需要的方法:
publicvoidwrite(intb):
将b的低位字节写到输出流,高位忽略。
publicvoidwrite(byteb[]):
将字节数组b中的全部字节顺序写到输出流
publicvoidflush():
清空缓冲区,并执行外设写操作
关闭流(断开与外设的连接,释放所占用资源):
publicvoidclose();
3)抽象基本类Reader和Writer:
用于字符数据流的读写操作。
8.3.2流的类型
结点流:
与输入输出端外设直接相连的流。
其构造函数的参数是外设端。
过滤流:
与另外的流相连的流,其构造函数的参数是另一流对象。
结点流有:
字节数组流ByteArrayInputStream和ByteArrayOutputStream:
实现与内存缓冲区的同步读写,以及对CPU寄存器的读写操作。
文件输入输出流FileInputStream和FileOutputStream:
负责完成对磁盘文件的顺序读写操作,是处理本地文件的类。
8.3.3几种具体输入输出流
ByteArrayInputStream(byte[]buf),为内存中的一个字节数组创建一个流。
FileInputStream(Stringname),为名为name的文件创建一个流。
过滤流有:
Buffered(Input/Output)Stream的作用是在数据送到目的之前先缓存,达到一定数量时再送到目的,已减少阻塞次数.
过滤输入输出流FilterInputStream和FilterOutputStream:
在输入输出的同时,可对数据进行指定类型或格式的转换。
数据输入输出流DataInputStream和DataOutputStream:
为过滤输入输出流的子类。
分别实现了接口DataInput和DataOutput中定义的带格式的读写操作,从而具备了对不同类型数据的读写能力,在文件和网络中经常使用。
如DataInputStream类的readByte(),readInt()…DataOutputStream类的writeFloat(floatv),writeChars(Strings)…
FilterInputStream(InputStreamin)
BufferedInputStream(InputStreamin)
DataInputStream(InputStreamin)
Reader类的子类:
BufferedReader(Readerin):
多个缓冲功能。
InputStreamReader(InputStreamin):
是一个从字节流到字符流的桥梁。
常见的:
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
in.readLine();
需要捕获异常。
InputStreamReader类是控制台类
FileReader(StringfileName):
用于从文本文件中读字符。
如:
Try{
BufferedReaderfin=newBufferedReader(newFileReader(“a.txt”));
Strings=fin.readLine();
}catch(IOExceptionioe){}
Writer类的子类:
BufferedWriter(Writerout);
PrintWriter(OutputStreamout);
OutputStreamWriter(OutputStreamout);
FileWriter(Stringname);
如:
try{
PrintWriterout=newPrintWriter(newFileWriter(“a.txt”,true));
out.println(“Iamastring”);
out.println(12.34);
}catch(IOExceptionioe){}
标准输入(键盘输入):
System.in
System.in是InputStream类的对象
使用System.in.read()从键盘上读入一个字节数据
如:
try{
charch=System.in.read();
}catch(IOException){…}
System.in只能读入二进制数据,不能把这些数据转化为其它的数据类型。
使系统进入阻塞(block)状态,程序被挂起,等待用户输入一个键盘数据后,才能继续运行下去。
标准输出(屏幕输出):
System.out
它是PrintStream类的对象,可调用println(),print()方法向屏幕输出不同类型的数据。
8.3.4标准输入输出
例8-6:
InputStreamReader是把字节流转换为字符流的桥梁。
BufferedReader是将输入缓存起来,以提高输入的效率,没有缓存,每次调用read()或readLine()会造成字节被读取,转换为字符,然后返回,这样会很费时,低效。
所以我们常看见的就是:
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in))
br.readline()会读取一行字符,并返回一个字符串中。
行以回车结束。
8.3.5文件的处理与随机访问
Java程序的文件与目录管理
文件与目录管理由类File实现,其属性包含了文件或目录的相关信息,方法用来完成对文件或目录的管理操作。
(1)创建File对象:
每个File对象都对应系统的一个磁盘文件或目录。
File类有3个构造函数:
File(Stringpath):
参数path指明对应文件或目录的路径名(包括文件或目录名)
File(Stringpath,Stringname):
参数path指定路径名,而参数name则指定文件名或目录名。
File(Filedir,Stringname):
参数dir是表示文件或目录的路径的File对象,而参数name指定文件名或目录名。
(2)获取文件或目录属性
publicbooleanexists():
判断文件或目录是否存在。
publicbooleanisFile():
判断对象是否代表有效文件。
publicbooleanisDirectory():
判断对象是否代表有效目录。
publicStringgetName():
返回文件或目录名。
publicStringgetPath():
返回文件或目录的路径。
publiclonglength():
获取文件长度(字节数)。
publicbooleancanRead():
判断文件是否可读。
publicbooleancanWrite():
判断文件是否可写。
publicString[]list():
将目录中所有文件名保存在字符串数组中返回。
publiclooleanequals(Filef):
比较两个文件或目录。
publicrenameTo(FilenewFile):
重命名文件。
publicvoiddelete():
删除当前文件。
publicbooleanmkdir():
创建当前目录的子目录。
《例8-7》FileOperation.java
文件输入和输出流
要读写磁盘文件,必须使用文件输入输出流类FileInputStream和FileOutputStream。
步骤:
(1)利用文件名或File对象创建输入输出流对象,如:
FileInputStream(StringfileName)
FileInputStream(Filef)
(2)从文件输入输出流中读写数据
直接利用FileInputStream和FileOutputStream的读写功能(只能完成以字节为单位的二进制数据的读写)
以FileInputStream和FileOutputStream作为数据源,套接其他输入输出流(如DataInputStream和DataOutputStream)完成读写。
如
FilemyFile=newFile(“myTextFile”);
DataInputStreamdin=newDataInputStream(newFileInputStream(myFile));
《例8-8》MyFileIo.java:
注意异常的捕获
程序对文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第8章 Java高级编程pptConvertor Java 高级 编程 pptConvertor