第8章 Java高级编程_第1页
第8章 Java高级编程_第2页
第8章 Java高级编程_第3页
第8章 Java高级编程_第4页
第8章 Java高级编程_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、第第 8 章章 Java 高级编程高级编程主要内容:v异常处理机制异常处理机制v多线程编程多线程编程vIO 编程编程v网络编程网络编程重点: IO 编程与网络编程8.1 异常处理 Java提供一套完善的异常处理机制,运行它可以提供程序的健壮性。健壮的程序能在遇到异常情况下采取解决措施,而不健壮的程序则在此时会终止,或返回错误的结果,而且难以检测出异常的原因。Throwable 类Exception 类Error 类RuntimeExceptionAWTExceptionIOExceptionIllegalAccessExceptionClassNotFoundExceptionInterrru

2、ptedException图 8-1 Throwable 类的继承结构异常类异常类1.异常类结构异常类结构所有异常类的祖先是java.lang.Throwable类。Exception 类和 Error 类都是 Throwable 类的子类。Error类:表示仅靠程序本身无法恢复的错误,由JVM抛出并处理。Exception类:表示程序本身可以处理的异常。一般我们讲的异常就是指这一类。vException类分为运行时异常和受检查异常。1.运行时异常:RuntimeException类及其子类。特点:Java编译器不检查。如:除数为0时出现的ArithmeticException。见下表2.受检

3、查异常:除运行时异常以外所有异常。特点: Java编译器会检查。2.运行异常运行异常系统定义的运行异常通常对应于系统运行错误,如表 8-1 所示。 表 8-1 系统定义的运行异常系统定义的运行异常 对应的运行错误 ClassNotFoundException 未找到欲装载的类 ArrayIndexOutOfBoundsException 数组越界使用 FileNotFoundException 未找到指定的文件或目录 IOException 输入输出错误 NullPointerException 引用尚未创建的对象 ArithmeticException 算术错误,如除数为0 Interrup

4、tedException 线程在睡眠、等待等被其他线程打断 UnknownHostException 无法确定主机的 IP 地址 SecurityException 安全性错误,如 Applet 欲读写文件 MalfoRMEDurlException URL 格式错误 3. 用户自定义的异常用户自定义的异常作用:用来处理用户程序中特定的逻辑运行错误。优点:以程序内建的方式统一处理错误(对照老方法);例 为“从空队列出队”的逻辑错误定义异常: class EmptyQueueException extends Exception Queue sourceQueue;public EmptyQue

5、ueException (Queue q)super(“队列已空” );sourceQueue = q ;public String toString ( ) return ( “队列”+sourceQueue.toString ( ) + “已空,出队引发异常”; 抛出异常抛出异常1.系统自动抛出的异常(系统自己定义的)例8-1:TestSystemException.java2.语句抛出的异常int dequeue() throws EmptyQueueExceptionif (isEmpty()throw (new EmptyQueueException(this);else见例子8-2

6、:TestQueueException.java异常机制概述v把各种不同的异常情况进行分类,这种类称为异常类,可以发挥类的可扩展性和重用性的优势。v异常流程的代码和正常流程的代码分离,提高了代码的可读性,简化了程序的结构。v可以灵活处理异常。有能力处理的就捕获并处理它,否则抛出异常,由方法调用者来处理。异常处理机制vtrycatch语句:捕获异常vfinally语句:任何情况下都必须执行的代码vthrows子句:声明可能会出现的异常:如果一个方法可能会出现异常,则方法声明处用该子句声明抛出异常。如:public void run() throws Exceptionvthrow语句:抛出异常,

7、如:public void run() throws Exceptionif(车子无法刹车) throw new Exception(“车子无法刹车”);多异常的处理v一个try块可能产生多种不同的异常,如需要以不同的方法来处理,就需要多异常处理机制。v特点:一个try块后跟多个catch块,每个catch块的参数不同。v流程:当try块抛出异常时,程序转向第一个catch块,看参数类型是否匹配,能否被其接收。v匹配的条件:异常对象与参数属于相同的例外类异常对象属于参数例外类的子类异常对象实现了参数所定义的接口。v使用JApplet实现某一门课程的分数录入系统,界面包括学号、姓名、班号、成绩的

8、输入域和一个录入按钮。当用户单击录入按钮时,程序检查各输入域中是否有非空的数据,如有空域则抛出一个Exception对象;同时程序检查成绩输入域,如果不是数值信息或是负的数值信息,也抛出相应的异常。抛出的异常应提供详细的信息说明,从而使使用该程序的用户了解所出现的问题,同时思考上述异常出现时程序应该如何处理。8.2 Java 多线程机制多线程机制v线程的概念v创建和启动线程v线程的调度v多个线程的同步v线程之间的通信8.2.1 Java 中的线程中的线程1.程序、进程与线程程序、进程与线程进程:程序的一次动态执行过程,每一个进程都有自己独立的内存空间。对一个应用程序可以同时启动多个进程。 线程

9、:比进程更小的执行单位。一个进程可以产生多个线程,它们分别执行不同的任务。当进程内的多个线程同时运行,则称为并发运行。线程间可以共享存储单元,实现信息交换、实时通信与同步操作。线程的创建和启动1.定义一个Thread类的子类,覆盖Thread类的run()方法,然后创建该子类的实例。2.定义一个实现Runnable接口的类,实现它的run()方法,然后将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例。3.调用start()方法启动线程。8.2.2 Java 的线程类与的线程类与 Runnable 接口接口1.Runnable 接口接口实现该接口的类必须实现该接口的 Ru

10、n ( ) 方法。实质定义了一个除主线程之外的新线程的操作。2.Thraed 类类(1)构造函数 public Thread ( ):创建系统线程类对象。 public Thread (Runnable target ):创建线程类对象,并利用参数对象的 run ( ) 方法进行初始化或覆盖新建线程的同名方法。 public Thread (String ThreadName ):创建一个具有指定名称的线程类对象。 public Thread (Runnable target, String ThreadName):综合上述功能。2.线程的状态与生命周期线程的状态与生命周期 程序的缺省主线程应

11、用程序:main ( ) 方法的执行线程Applet: 指挥浏览器加载并执行小程序的线程 多线程的实现 在主线程中创建新的线程对象(Thread 类或其子类的对象)。新建就绪阻塞运行死亡线程生命周期经历的 5 种状态:(1)新建:声明并创建 Thread 类或其子类对象。(2)就绪:新建线程启动后进入线程队列等待 CPU 时间片,或阻塞线程被解除阻塞,都处于就绪状态。(3)运行:线程被调度并获得处理器资源,便自动调用本对象的 run ( )方法进入运行状态。(4)阻塞:线程被人为挂起或需执行费时的输入输出时,让出 CPU 并暂时中止执行。(5)死亡:线程完成正常运行或通过 stop ( ) 或

12、 destroy ( ) 方法被强制终止。图 8-3 线程的生命周期线程调度管理器线程调度管理器负责管理线程排队和处理器资源在线程间的分配。一般通过线程调度算法自动为各线程分配优先级。Thread类有与优先级相关的静态常量: MIN_PRIORITY1 MAX_PRIORITY10 NORM_PRIORITY5 系统为新建线程指定优先级的原则: 1)新线程继承创建它的父线程的优先级; 2)主线程一般具有普通优先级。3.线程调度与优先级线程调度与优先级线程的主要方法:start ( ):启动线程,使之进入就绪状态。 run ( ):定义线程要执行的主体,由系统自动调用。 sleep (int m

13、illsecond ):使线程暂时休眠,让出处理器。 isAlive ( ):判断线程是否消亡。 setPriority (int p ):设置或修改线程优先级。你必须确保你的代码中的线程会不时地给另一个线程运行的机会。可以有以下方法:位于运行状态的线程调用Thread.sleep()方法。位于运行状态的线程调用Thread.yield()方法。位于运行状态的线程调用另一个线程的join()方法。线程睡眠:Thread.sleep()方法,见ch88.2.3machine.java。线程让步:Thread.yield()方法,把上面的示例中sleep()改成yield()方法。等待其他线程结束

14、:join()方法,见ch88.2.3joinmachine.java。public class Machine extends Thread public void run() for(int a=0;a50;a+) System.out.println(currentThread().getName()+:+a); try sleep(100); /给其他线程运行的机会 catch(InterruptedException e)throw new RuntimeException(e); public static void main(String args) Machine machin

15、e1=new Machine(); /创建第一个Machine对象 Machine machine2=new Machine(); /创建第二个Machine对象 machine1.start(); /启动第一个Machine线程 machine2.start(); /启动第二个Machine线程8.2.3 如何在程序中实现多线程如何在程序中实现多线程1.创建创建 Thread 类的子类类的子类public class MyRunnable implements Runnablepublic void run()int a=0;for(a=0;a10;a+)tryThread.sleep(10

16、0);catch(Exception e)System.out.println(Thread.currentThread().getName()+” “+a);public static void main(String args)MyRunnable mr=new MyRunnable();Thread r1=new Thread(mr);Thread r2=new Thread(mr);t1.start();t2.start();例 8-5UseRunnable.java2.实现实现 Runnable 接口接口用户类通过实现 Runnable 接口的 run ( ) 方法定义用户线程的操作

17、。以该类为参数创建 Thread 对象,就可继承该方法。8.3 流式输入输出与文件处理流式输入输出与文件处理8.3.1 Java 输入输出类库输入输出类库1.流的概念流的概念 流:在计算机输入输出之间流动的数据序列。 流式输入输出的特点:数据的获取和发送均沿数据序列顺序进行。Java的io包中有不同的流类对应性质不同的io流。当Java程序需要从外设中读入、写出数据时,它应该创建一个合适的流类对象,完成与外设的连接;然后再调用该对象的read()/write()方法,实现io操作。输入输出流类输入输出流类(1)基本输入输出流类 具有最基本的输入输出功能的抽象类,不能实例化1)InputStre

18、am 类 包含所有输入流都需要的方法,可完成最基本的从输入流读入数据的功能。从输入流读入数据(只能以二进制形式读入): public int read ( ):从当前位置读入一个 0 到 255 范围内的 int 字节值返回。 public int read (byte b ):从当前位置处连续读入多个字节,保存在字节数组 b 中,并返回所读到的字节数。 定位输入位置指针: public long skip (long n ):从当前位置向后跳过 n个字节 public void mark ( ):在当前位置处做标记 public void reset ( ):将位置指针返回到标记的位置关闭流

19、(断开与外设的连接,释放所占用资源): public void close ( ) ;2)OutputStream 类包含所有输出流都需要的方法: public void write (int b):将 b 的低位字节写到输出流,高位忽略。 public void write (byte b ):将字节数组 b 中的全部字节顺序写到输出流 public void flush ( ):清空缓冲区,并执行外设写操作关闭流(断开与外设的连接,释放所占用资源):public void close ( ) ;3)抽象基本类 Reader 和 Writer:用于字符数据流的读写操作。8.3.2流的类型v结

20、点流:与输入输出端外设直接相连的流。其构造函数的参数是外设端。v过滤流:与另外的流相连的流,其构造函数的参数是另一流对象。结点流有:v字节数组流 ByteArrayInputStream 和 ByteArrayOutputStream:实现与内存缓冲区的同步读写,以及对 CPU 寄存器的读写操作。v文件输入输出流 FileInputStream 和 FileOutputStream:负责完成对磁盘文件的顺序读写操作,是处理本地文件的类。8.3.3几种具体输入输出流过滤流有:vBuffered(Input/Output)Stream的作用是在数据送到目的之前先缓存,达到一定数量时再送到目的,已减

21、少阻塞次数.v过滤输入输出流 FilterInputStream 和 FilterOutputStream:在输入输出的同时,可对数据进行指定类型或格式的转换。v数据输入输出流 DataInputStream 和 DataOutputStream:为过滤输入输出流的子类。分别实现了接口 DataInput 和 DataOutput 中定义的带格式的读写操作,从而具备了对不同类型数据的读写能力,在文件和网络中经常使用。如 DataInputStream 类的 readByte ( ) , readInt ( ) DataOutputStream 类的 writeFloat (float v )

22、, writeChars (String s) Reader类的子类:vBufferedReader(Reader in):多个缓冲功能。vInputStreamReader(InputStream in):是一个从字节流到字符流的桥梁。常见的:BufferedReader in=new BufferedReader(new InputStreamReader(System.in);in.readLine();需要捕获异常。vFileReader(String fileName):用于从文本文件中读字符。v如:TryBufferedReader fin=new BufferedReader(n

23、ew FileReader(“a.txt”);String s=fin.readLine();catch(IOException ioe)Writer类的子类:vBufferedWriter(Writer out);vPrintWriter(OutputStream out);vOutputStreamWriter(OutputStream out);vFileWriter(String name);如:tryPrintWriter out=new PrintWriter(new FileWriter(“a.txt”,true);out.println(“I am a string”);out

24、.println(12.34);catch(IOException ioe)I.标准输入标准输入(键盘输入):System .inSystem.in 是InputStream类的对象1.使用 System . in . read ( )从键盘上 读入一个字节数据如: try char ch = System.in. read ( ); catch (IOException ) 2.System . in 只能读入二进制数据,不能把这些数据转化为其它的数据类型。3.使系统进入阻塞 (block) 状态,程序被挂起,等待用户输入一个键盘数据后,才能继续运行下去。II.标准输出标准输出(屏幕输出):

25、System . out它是PrintStream类的对象,可调用println(),print()方法向屏幕输出不同类型的数据。8.3.4 标准输入输出例86:vInputStreamReader是把字节流转换为字符流的桥梁。vBufferedReader是将输入缓存起来,以提高输入的效率,没有缓存,每次调用read()或 readLine()会造成字节被读取,转换为字符,然后返回,这样会很费时,低效。v所以我们常看见的就是:vBufferedReader br = new BufferedReader(new InputStreamReader(System.in)vbr.readline

26、()会读取一行字符,并返回一个字符串中。行以回车结束。8.3.5 文件的处理与随机访问文件的处理与随机访问1.Java 程序的文件与目录管理程序的文件与目录管理文件与目录管理由类 File 实现,其属性包含了文件或目录的相关信息,方法用来完成对文件或目录的管理操作。(1)创建 File 对象:每个File对象都对应系统的一个磁盘文件或目录。 File 类有 3 个构造函数: File (String path):参数 path 指明对应文件或目录的路径名(包括文件或目录名) File (String path, String name):参数 path 指定路径名,而参数 name 则指定文件

27、名或目录名。 File (File dir, String name):参数 dir 是表示文件或目录的 路径的File 对象,而参数 name 指定文件名或目录名。(2)获取文件或目录属性 public boolean exists ( ):判断文件或目录是否存在。 public boolean isFile ( ):判断对象是否代表有效文件。 public boolean isDirectory ( ) :判断对象是否代表有效目录。 public String getName ( ):返回文件或目录名。 public String getPath ( ):返回文件或目录的路径。 publi

28、c long length ( ) :获取文件长度(字节数)。public boolean canRead ( ):判断文件是否可读。 public boolean canWrite ( ) :判断文件是否可写。 public String list ( ):将目录中所有文件名保存在字符串数组中返回。 public loolean equals (File f ):比较两个文件或目录。 public renameTo (File newFile):重命名文件。 public void delete ( ):删除当前文件。 public boolean mkdir ( ):创建当前目录的子目录。

29、例 8-7 FileOperation.java2.文件输入和输出流文件输入和输出流 要读写磁盘文件,必须使用文件输入输出流类 FileInputStream 和FileOutputStream。 步骤:(1)利用文件名或 File 对象创建输入输出流对象,如: FileInputStream (String fileName) FileInputStream (File f )(2)从文件输入输出流中读写数据a)直接利用 FileInputStream 和FileOutputStream 的读写功能(只能完成以字节为单位的二进制数据的读写)b)以 FileInputStream 和FileO

30、utputStream 作为数据源,套接其他输入输出流(如 DataInputStream 和DataOutputStream)完成读写。如 File myFile = new File (“ myTextFile”) ; DataInputStream din = new DataInputStream (new FileInputStream (myFile);例 8-8MyFileIo.java:注意异常的捕获3.程序对文件的随机访问程序对文件的随机访问 利用 RandomAccessFile 类,可以实现对文件的随机读写。(1)创建 RandomAccessFile 对象 构造函数为:

31、 RandomAccessFile (String name, String mode) RandomAccessFile (File f, String mode) 以指定文件名(前者)或 File 对象(后者)作为数据源,按给定的访问模式 mode 创建对象。mode 的取值有两种:“r” 表示只读方式,“rw” 表示读写方式。 例File file = new File (“BankFile.txt”); RandomAccessFile rf = new RandomAccessFile (file, “rw”);(2)对文件位置指针的操作8.5 用用 Java 实现底层网络通信实现底

32、层网络通信8.5.1 基于连接的流式套接字基于连接的流式套接字套接字(Socket ): Socket 是 TCP/IP 协议的编程接口,利用它提供的 API 就可编程实现 TCP/IP 协议。 TCP/IP 地址:TCP/IP 的主要功能是提供点对点通信机制。每个节点要有唯一的地址。 TCP/IP 地址的形式为 32 位二进制数。一般将它表示成 4 个十进制数,各取 0 255 的值。域名系统 DNS:DNS 名由用圆点隔开的几个部分组成。具体名在前,广域名在后。1.InetAddress 类类 这是一个存储远程系统 IP 地址的类,其中含有许多与网络编程有关的变量和方法,可用来区分网络中的

33、不同节点。InetAddress 对象包含 IP 地址、主机名等信息。 InetAddress 类没有公共构造函数,只能用静态方法 getByName 或getLocalHost 创建新的 InetAddress 对象。例如: try InetAddress remoteIP = InetAddress. getByName(“”); InetAddress myIP = InetAddress. getLocalHost ( ); catch (UnknownHostException e) System. err. println (“Unknown host “+e);例 8-16MyI

34、pAddress.java2.流式流式 Socket 的通信机制的通信机制流式 Socket 通信是一种基于连接的通信,即先由双方确认身份并建立一条专用的虚拟连接通道,再通过该通道传送数据进行通信,通信结束再拆除连接(图 8-17)。优点:通信准确无误。缺点:1)连接的建立和拆除增加了程序复杂性;2)通信过程保持连接要占用系统内存等资源。适用场合:集中、连续的通信,如网上聊天。3.Socket 类与类与 ServerSocket 类类(1) ServerSocket 类 在服务器端创建 ServerSocket 对象,就可建立监听服务: ServerSocket listener = new

35、ServerSocket (8000) ; 这里,参数 8000 代表提供监听服务的端口号。 为了随时监听可能的 Client 请求,还要调用ServerSocket 类的 accept ( ) 方法: Socket linkSocket = listener. accept ( ) ; 关闭 ServerSocket 对象,结束监听服务Server 端创建 ServerSocket 对象,在某 端口提供监听服务等待来自 Client 端的服务请求接收 Client 端的请求,用返回的 Socket 建立连接通过向 Socket 中读写数据来与 Client 端通信关闭 Socket,结束与当

36、前 Client 的通信,等待其他请求通过向 Socket 中读写数据来与 Server端通信关闭 Socket,结束与 Server 端的通信创建 Socket 对象,向 Server 的监听端口请求通信Client 端建立连接数据通信拆除连接图 8-17 流式 Socket 通信过程该方法的执行使 Server 端的程序处于等待状态,直到捕捉到一个来自 Client 端的请求,并返回一个用于与之通信的 Socket 对象 linkSocket 。向该对象读写数据,就可实现向远端的 Client读写数据。要结束监听,可调用 ServerSocket 类的 close ( ) 方法: list

37、ener. close ( );(2) Socket 类 客户端程序要从服务器端获取信息及其他服务时,应创建一个 Socket 对象: Socket mySocket = new Socket (“ServerName”, 8000); 其中,第一个参数是主机地址,第二个参数是对应的端口号。对象建立成功,则建立一个连接,就可在 Client 和 Server 之间传递数据。通信结束后,可调用该类的 close ( ) 方法关闭 Socket ,拆除连接 mySocket . close ( ) ;4.实现流式实现流式 Socket 通信的通信的 Client 端与端与 Server 端编程端编

38、程例 8-17 MySocketServer.java 和 MyClient.java8.5.2 无连接的数据报无连接的数据报 特点:数据报是无连接的远程通信服务,数据以独立的包为单位发送,不保证传送顺序和内容的准确性,可靠性较差;但效率较高,系统资源的开销也较小。数据报 Socket 又称 UDP (User Datagram Protocol ,用户数据报) 套接字,无须建立、拆除连接,直接将信息打包传向目的地。1.DatagramPacket 类与类与 DatagramSocket 类类(1)DatagramPacket 类 构造函数: public DatagramPacket (by

39、te ibuf , int ilength ):创建接收数据报的对象,两个参数分别代表接收数据的字节数组和所接收的数据报长度。如果 ilenth 小于所接收到的数据报长度,则多余的字节被忽略。 public DatagramPacket (byte ibuf , int ilength , InetAddress isddr, int iport ):创建发送数据报,第一个参数是存放待发送报文的字节数组;第二参数是数组长度;第三个参数指定发送目的地,既接收者的 IP 地址;参数 iport 指明目标主机的端口号。(2)DatagramSocket 类 构造函数: public DatagramSocket ( ):创建数据报 Socket 并将它连接在本地主机的任一个可用的端口上。 public DatagramSocket (int port )

温馨提示

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

评论

0/150

提交评论