《第9章 Java高级编程课件》由会员分享,可在线阅读,更多相关《第9章 Java高级编程课件(37页珍藏版)》请在金锄头文库上搜索。
1、学习导读 本章将介绍Java语言中的一些高级特性:异常处理、多线程机制、流式IO以及网络通信,其中每个部分都能扩展成一个专题。读者在本章学习到的只是其中很小的一部分,但是能够从中了解一些基本概念和基本操作,为今后的深入学习打下基础。异常处理提供对错误的捕捉和处理机制;多线程机制使得程序的多个子任务能够“同时”执行;流式IO提供了对输入输出的读写机制;网络通信特性允许Java程序通过Socket实现底层通信,并利用Java提供的扩展组件实现高层服务。,第九章 Java高级编程,教学重点与难点:,异常处理、多线程机制、流式IO以及网络通信的基本概念和模型 异常的捕获和处理 多线程的实现及Runna
2、ble接口的应用 流式输入输出的操作、文件读写及随机访问 基于Socket的面向连接的网络底层通信及高层服务,9.1 异常处理,在Java中,提供了错误捕捉和处理机制,即异常处理机制。在程序运行过程中发生错误时,Java允许其不按照正常路径完成任务,由发现错误的方法抛出封装了错误信息的对象(异常)到其调用程序,发出已经发生问题的信号,然后立即退出;而且,程序并不在调用该方法的代码处继续执行,而是由异常处理机制开始搜索一个能够处理这种特定错误情况的异常处理器。,9.1.1 异常分类,Throwable类派生出两个分支:Error和Exception。 Error类被认为是不能恢复的严重错误,如系
3、统内部错误和资源耗尽错误等。不应该抛出这种类型的错误,而是让程序中断。 Exception类定义可能遇到的轻微错误,分为派生自RuntimeException类的异常和非派生自RuntimeException类的异常。这时,可以写代码来处理异常并继续程序执行,而不是让程序中断。 区分RuntimeException和非RuntimeException的规则是:编程错误导致RuntimeException,如被零除、数组越界访问、空指针访问等;而其他异常则是由于意外情况而发生的,如试图读取文件结尾以后的数据、试图打开错误的URL、试图根据并不代表已存在类的字符串来查找Class对象等。,9.1.
4、2 方法如何抛出异常,/本方法从长度为2048字节的某文件中读入数据到字符串对象中。 String readFile(BufferedReader in) throws EOFException . while(.) /ch为当前读入的字符。 if(ch = -1) /文件尾; /当nlen,意味着还未将文件全部读入字符串,就遇到文件结束标志,视为异常情况。 if(n len) throw new EOFException(); /或者采用下面的方法: /if(n len) /EOFException readeof= new EOFException(); /throw readeof; .
5、 return s;,9.1.3捕获及处理异常,try 可能产生异常的代码 /try块 catch(ExceptionType1 e1) /要捕获的异常类型1 对此异常的处理 /异常处理1 catch(ExceptionType2 e2) /要捕获的异常类型2 对此异常的处理 /异常处理2 catch(ExceptionType3 e3) /要捕获的异常类型3 对此异常的处理 /异常处理3 ,【例9.1】 捕获并处理异常 程序代码见ExceptionExample .java。运行结果如下: Caught the Exception! e.getMessage(): I throw an Ex
6、ception!,【例9.2】重新抛出异常 程序代码见RethrowException .java。运行结果如下: the original exception in f() Caught in main Exception in thread main java.lang.Exception: thrown from f() at RethrowException.f(RethrowException.java:8) at RethrowException.main(RethrowException.java:14),9.1.4创建自己的异常类,我们可以创建自己的异常类,以便对特殊的异常进行
7、处理。创建的方法很简单:继承现有的异常类。 【例9.3】创建自己的异常类。 程序代码见ExceptionInherit .java。运行结果如下: Throwing MyException MyException: the second constructor! at ExceptionInherit.f(ExceptionInherit.java:19) at ExceptionInherit.main(ExceptionInherit.java:25) 【例9.4】创建具有更多功能的异常类。 程序代码见ExceptionInherit2.java。运行结果如下: Throwing MyEx
8、ception2 e.value()=4 MyException2: the third constructor! at ExceptionInherit2.f(ExceptionInherit2.java:29) at ExceptionInherit2.main(ExceptionInherit2.java:35),9.2 Java多线程机制,进程、线程示意图,【例9.5】 未使用多线程技术的记数程序。 当单击“Start”按钮时,屏幕上方的文本框开始递增记数,从0到49。在记数过程单击“Close”按钮不起作用,记数依然在继续;当记数到49时,程序退出。 程序代码见Counter .ja
9、va。运行结果如下:,9.2.1创建线程,创建线程:将需要独立运行的子任务代码放到从Thread类派生出来的类的run方法中。然后在主线程中原先调用该子任务的地方先创建一个该线程类的实例,再调用线程类中的start方法启动线程。 【例9.6】使用线程技术的记数程序。 在记数过程中,当单击“Close”按钮时,程序立刻会退出。 程序代码见CounterThread .java。运行结果如下:,9.2.2 实现多个线程,在以上例子的基础上,创建多个记数线程同时记数。 【例9.7】实现多个记数线程的记数程序 。 当多次单击“Add”按钮时,窗口中的文本框会依次增加,每个文本框都执行自己的记数功能。
10、程序代码见CounterMultiThread .java。运行结果如下:,9.2.3 线程的状态,线程状态及状态转换示意图,9.2.4 Runnable接口,前面介绍了如何通过创建自己的线程类来实现多线程,即将线程类(Thread)与程序的主类(Main)分离。 class CounterSubTask extends Thread . public void run() . public class CounterMultiThread public static void main(String args) . 如果CounterSubTask类,也就是run方法所在的类已经拥有另一个超
11、类,那将无法继承Thread类,此时如何实现多线程呢?典型的情况是,对于一个GUI程序,需要从JFrame或JApplet类派生。这时,虽然不能继承Thread类,但是可以通过实现Runnable接口来实现多线程。,【例9.8】 通过Runnable接口实现多个记数线程的Java小应用程序 。 程序代码见CounterThreadApplet .java。运行结果如下:,9.3 流式输入输出与文件处理,在Java中,应用程序所需要读入的数据和写出的数据是通过I/O操作实现的。这些读写数据的源或目的包括文件、内存、网络连接等,其中,最常用的是文件。 Java中的输入输出流可以分为两大类:输入流和
12、输出流。输入流是能够读取字节的对象,而输出流是能够写字节序列的对象。最初设计的输入输出类是面向字节流的,即能够支持8位的字节流,分别由派生自抽象类InputStream和OutputStream的类层次来表示。但是随着对国际化支持的需求出现,面向字节的流不能很好地处理使用Unicode(每个字符使用两个字节)的数据,因此引入了派生自抽象类Reader和Writer的类层次,用于读写双字节的Unicode字符,而不是单字节字符。,9.3.1 Java输入输出类库继承关系,面向字节流的输入输出类层次关系图,处理Unicode字符的输入输出类层次关系图,9.3.2基于标准输入输出的IO操作,在Jav
13、a里,还提供了“标准输入流”和“标准错误输出流”,分别对应于System.in和System.err。System.out和System.err已经被封装成PrintStream对象,因此具有强大的输出功能;但是System.in却仍然是原始的InputStream,需要在使用的时候进行封装。 【例9.9】标准输入输出 。 程序代码见StandardIO .java。运行结果如下: Enter String: abcde Abcde Enter an Integer: -12345 -12345 Enter a Double: -12345 -12345.0,【例9.10】结构化数据输入输出和
14、数据分隔 。 程序代码见TokenStandardIO .java。运行结果如下: The number 1 person Enter name,age,salary,married(optional), please separate fields by : 张三:25:3000 The number 2 person Enter name,age,salary,married(optional), please separate fields by : 李四:35:10000:Y The number 3 person Enter name,age,salary,married(optio
15、nal), please separate fields by : 王大五:30:4000:F Output the data of people: The number 1 person name: 张三; age:25; salary: 3000.0; married: F The number 2 person name: 李四; age:35; salary: 10000.0; married: Y The number 3 person name: 王大五; age:30; salary: 4000.0; married: F,9.3.3文件读写及随机访问,文件是保存在磁盘等二级存储
16、设备上的数据,由记录组成,文件中的一行可以看作是一条记录。对文件的读写和标准输入输出是十分类似的,需要注意的是要采用专门对文件操作的流,并应该在合适的时候关闭流,否则系统资源无法得到释放。对于输出流,如果不执行关闭流的操作,则缓冲区的数据将有可能没有写入文件,造成文件损坏。 【例9.11】文件读写 。 将标准输入的数据写到文件中,然后再从文件中读取数据,并输出到标准输出。 程序代码见FileRW .java。运行结果如下:,The number 1 person Enter name,age,salary,married(optional), please separate fields by : 张三:25:3000 The number 2 person Enter name,age,salary,married(optional), please separate fields by : 李四:35:10000:Y The nu