JAVA教程第四讲Java的例外处理和I

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

JAVA教程第四讲Java的例外处理和I/O流4.1什么是例外例外就是在程序的运行过程中所发生的异常事件,它中断指令的正常执行。Java中提供了一种独特的处理例外的机制,通过例外来处理程序设计中出现的错误。4.1.1例外示例【例4-1】importJava.io.*;classExceptionDemo1{publicstaticvoidmain(Stringargs[]){FileInputStreamfis=newFileInputStream(text);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}查看编译结果【例4-2】classExceptionDemo2{publicstaticvoidmain(Stringargs[]){inta=0;System.out.println(5/a);}}运行结果C:\javacExceptionDemo2.JavaC:\JavaExceptionDemo2Java.lang.ArithmeticException:/byzeroatExceptionDemo2.main(ExceptionDemo2.Java:4)因为除数不能为0,所以在程序运行的时候出现了除0溢出的异常事件。为什么有的例外在编译时出现,而有的例外是在运行时出现的?让我们继续学习Java的例外处理机制。4.1.2例外处理机制抛弃(throw)例外:在Java程序的执行过程中,如果出现了异常事件,就会生成一个例外对象。生成的例外对象将传递给Java运行时系统,这一例外的产生和提交过程称为抛弃(throw)例外两种处理例外的机制:◇捕获例外:当Java运行时系统得到一个例外对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一例外的代码。找到能够处理这种类型的例外的方法后,运行时系统把当前例外对象交给这个方法进行处理,这一过程称为捕获(catch)例外。这是积极的例外处理机制。如果Java运行时系统找不到可以捕获例外的方法,则运行时系统将终止,相应的Java程序也将退出。◇声明抛弃例外:如果一个方法并不知道如何处理所出现的例外,则可在方法声明时,声明抛弃(throws)例外。这是一种消极的例外处理机制。4.1.3例外类的层次在jdk中,每个包中都定义了例外类,而所有的例外类都直接或间接地继承于Throwable类。图4-1为jdk中例外类的继承关系。Java中的例外类可分为两大类:Error动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类例外,也不会抛弃这种例外。Exception1)运行时例外:继承于RuntimeException的类都属于运行时例外,例如算术例外(除零错)、数组下标越界例外等等。由于这些例外产生的位置是未知的,Java编译器允许程序员在程序中不对它们做出处理。2)非运行时例外:除了运行时例外之外的其他由Exception继承来的例外类都是非运行时的例外,例如FileNotFoundException(文件未找到例外)。Java编译器要求在程序中必须处理这种例外,捕获例外或者声明抛弃例外。4.2例外的处理Java语言中有两种例外处理机制:捕获例外和声明抛弃例外。下面我们做详细介绍。4.2.1捕获例外捕获例外是通过try-catch-finally语句实现的。try{......}catch(ExceptionName1e){......}catch(ExceptionName2e){......}......}finally{......}◇try捕获例外的第一步是用try{…}选定捕获例外的范围,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。◇catch每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的例外事件。catch语句只需要一个形式参数指明它所能够捕获的例外类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的例外对象传递给catch块。在catch块中是对例外对象进行处理的代码,与访问其它对象一样,可以访问一个例外对象的变量或调用它的方法。getMessage()是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。例如:try{......}catch(FileNotFoundExceptione){System.out.println(e);System.out.println(message:+e.getMessage());e.printStackTrace(System.out);}catch(IOExceptione){System.out.println(e);}catch语句的顺序:捕获例外的顺序和catch语句的顺序有关,当捕获到一个例外时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类,再安排父类。◇finally捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。4.2.2声明抛弃例外1.声明抛弃例外如果在一个方法中生成了一个例外,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃例外,使得例外对象可以从调用栈向后传播,直到有合适的方法捕获它为止。声明抛弃例外是在一个方法声明中的throws子句中指明的。例如:publicintread()throwsIOException{......}throws子句中同时可以指明多个例外,之间由逗号隔开。例如:publicstaticvoidmain(Stringargs[])throwsIOException,IndexOutOfBoundsException{…}2.抛出例外抛出例外就是产生例外对象的过程,首先要生成例外对象,例外或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出例外对象是通过throw语句实现的。例如:IOExceptione=newIOException();throwe;可以抛出的例外必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:thrownewString(wanttothrow);4.3自定义例外类的使用自定义例外类必须是Throwable的直接或间接子类。注意:一个方法所声明抛弃的例外是作为这个方法与外界交互的一部分而存在的。所以,方法的调用者必须了解这些例外,并确定如何正确的处理他们。4.4I/O流概述输入/输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。Jdk提供了包java.io,其中包括一系列的类来实现输入/输出处理。下面我们对Java.io包的内容进行概要的介绍。4.4.1I/O流的层次1.字节流:从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。◇InputStream、OutputStream◇FileInputStream、FileOutputStream◇PipedInputStream、PipedOutputStream◇ByteArrayInputStream、ByteArrayOutputStream◇FilterInputStream、FilterOutputStream◇DataInputStream、DataOutputStream◇BufferedInputStream、BufferedOutputStream2.字符流:从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。◇Reader、Writer◇InputStreamReader、OutputStreamWriter◇FileReader、FileWriter◇CharArrayReader、CharArrayWriter◇PipedReader、PipedWriter◇FilterReader、FilterWriter◇BufferedReader、BufferedWriter◇StringReader、StringWriter3.对象流◇ObjectInputStream、ObjectOutputStream4.其它◇文件处理:File、RandomACCESSFile;◇接口DataInput、DataOutput、ObjectInput、ObjectOutput;4.4.2InputStream和OutputStream1.InputStream◇从流中读取数据:intread();//读取一个字节,返回值为所读的字节intread(byteb[]);//读取多个字节,放置到字节数组b中,通常//读取的字节数量为b的长度,返回值为实际//读取的字节的数量intread(byteb[],intoff,intlen);//读取len个字节,放置//到以下标off开始字节//数组b中,返回值为实//际读取的字节的数量intavailable();//返回值为流中尚未读取的字节的数量longskip(longn);//读指针跳过n个字节不读,返回值为实际//跳过的字节数量◇关闭流:close();//流操作完毕后必须关闭◇使用输入流中的标记:voidmark(intreadlimit);//记录当前读指针所在位置,readlimit//表示读指针读出readlimit个字节后//所标记的指针位置才失效voidreset();//把读指针重新指向用mark方法所记录的位置booleanmarkSupported();//当前的流是否支持读指针的记录功能有关每个方法的使用,详见JavaAPI。2.OutputStream◇输出数据:voidwrite(intb);//往流中写一个字节bvoidwrite(byteb[]);//往流中写一个字节数组bvoidwrite(byteb[],intoff,intlen);//把字节数组b中从//下标off开始,长度为len的字节写入流中◇flush()//刷空输出流,并输出所有被缓存的字节由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。◇关闭流:close();//流操作完毕后必须关闭4.4.3I/O中的例外进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:FileNotFoundException,EOFException,IOException4.5文件处理I/O处理中,最常见的是对文件的操作,Java.io包中有关文件处理的类有:File、FileInputStream、FileOutputStream、RamdomACCESSFile和FileDescriptor;接口有:FilenameFilter。4.5.1文件描述类File提供了一种与机器无关的方式来描述一个文件对象的属性。下面我们介绍类File中提供的各种方法。◇文件或目录的生成publicFile(Stringpath);/*如果path是实际存在的路径,则该File对象/*表示的是目录;如果path是文件名,则该File对象表示的是文件。*/publicFile(Stringpath,Stringname);//path是路径名,name是文件名publicFile(Filedir,Stringname);//dir是路径名,name是文件名◇文件名的处理Strin

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功