《Java编程 第五章.ppt》由会员分享,可在线阅读,更多相关《Java编程 第五章.ppt(102页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、异常处理什么是异常异常就是在程序的运行过程中所发生的异常事件,它中断指令的正常执行。异常示例import java.io.*;class ExceptionDemo1public static void main(String args )FileInputStream fis=new FileInputStream(text);int b;while(b=fis.read()!=-1)System.out.print(b);fis.close();异常示例C:javac ExceptionDemol.javaExceptionDemo1.java:6:Exception java.io.Fi
2、leNotFoundException must be caught,or it must be declared in the throws clause of this method.FileInputStream fis=new FileInputStream(text);ExceptionDemo1.java:8:Exception java.io.IOException must be caught,or it must be declared in the throws clause of this method.while(b=fis.read()!=-1)2 errors异常示
3、例class ExceptionDemo2public static void main(String args )int a=0;System.out.println(5/a);异常示例C:javac ExceptionDemo2.javaC:java ExceptionDemo2java.lang.ArithmeticException:/by zeroat ExceptionDemo2.main(ExceptionDemo2.java:4)异常处理机制在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称
4、为抛弃(throw)异常。异常处理机制当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。异常(Throwable)分类Error动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类异常,也不会抛弃这种异常。Exception运行时异常继承于RuntimeException。Java编译器允许程序不对它们做出处理。其他异常除了运行时异常之外的其他由Except
5、ion继承来的异常类。Java编译器要求程序必须捕获或者声明抛弃这种异常。AWTExceptionThrowableErrorExceptionRuntimeExceptionIOExceptionLinkageErrorVirtualMachineErrorAWTErrorArithmeticExceptionIndexOutOfBounds.InterruptedExceptionFileNotFoundExceptionEOFException.捕获异常捕获异常是通过try-catch-finally语句实现的。try.catch(ExceptionName1 e).catch(Exce
6、ptionName2 e).finally.try捕获异常的第一步是用try选定捕获异常的范围,由try所限定的代码块中的语句在执行过程中可能会生成异常对象并抛弃。catch 每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块.在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage()是类Throwable所提供的方法,用来得到有关
7、异常事件的信息,类Throwable还提供了方法printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。try.catch(FileNotFoundException e)System.out.println(e);System.out.println(message:+e.getMessage();e.printStackTrace(System.out);catch(IOException e)System.out.println(e);catch语句的顺序捕获异常的顺序和不同catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排ca
8、tch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。try int b=0;System.out.println(5/b);catch(ArithmeticException e)finally if(fis!=null)System.out.println(“closing FileInputStream”);else S
9、ystem.out.println(“FileInputStream not open”);声明抛弃异常如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。声明抛弃异常声明抛弃异常是在一个方法声明中的throws子句中指明的。例如:public int read()throws IOException.throws子句中同时可以指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛弃它们:public static void main(String args)
10、throws IOException,IndexOutOfBoundsException 抛弃异常抛弃异常首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。抛弃异常对象是通过throw语句实现的。IOException e=new IOException();throw e;可以抛弃的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:throw new String(want to throw);异常类的使用自定义异常类必须是Throwable的直接或间接子类一个方法所声明抛弃的异常是作为这个方法与外界交互的一部分而存在的。方法
11、的调用者必须了解这些异常,并确定如何正确的处理他们。异常类的使用FileInputStream 的APIpublic FileInputStream(String name)throws FileNotFoundException异常示例import java.io.*;class ExceptionDemo1public static void main(String args )FileInputStream fis=new FileInputStream(text);异常类的使用积极处理方式:import java.io.*;class ExceptionDemo1public stat
12、ic void main(String args )try FileInputStream fis=new FileInputStream(text);catch(FileNotFoundException e)异常类的使用消极处理方式:import java.io.*;class ExceptionDemo1public static void main(String args )throws FileNotFoundException FileInputStream fis=new FileInputStream(text);异常类的使用如果采用消极处理方式,则由调用该方法的方法进行处理;
13、但是调用该方法的方法也可以采用消极和积极两种处理方式,一直传递到Java运行环境.异常类的使用运行时异常则表示由运行时系统所检测到的程序设计问题或者API的使用不当问题,它可能在程序的任何地方出现:(1)对于运行时异常,如果不能预测它何时发生,程序可以不做处理,而是让Java虚拟机去处理它。(2)如果程序可以预知运行时异常可能发生的地点和时间,则应该在程序中进行处理,而不应简单的把它交给运行时系统。异常类的使用(3)在自定义异常类时,如果它所对应的异常事件通常总是在运行时产生的,而且不容易预测它将在何时、何处发生,则可以把它定义为运行时异常,否则应定义为非运行时异常。模拟考题模拟考题Quest
14、ion 60)Given the following code import java.io.*;public class Ppvgpublic static void main(String argv)Ppvg p=new Ppvg();p.fliton();public int fliton()try模拟考题模拟考题 FileInputStream din=new FileInputStream(Ppvg.java);din.read();catch(IOException ioe)System.out.println(flytwick);return 99;finally System.
15、out.println(fliton);return-1;模拟考题模拟考题 Assuming the file Ppvg.java is available to be read which of the following statements are true if you try to compile and run the program?1)The program will run and output only flytwick2)The program will run and output only fliton模拟考题模拟考题 3)The program will run a
16、nd output both fliton and flytwick4)An error will occur at compile time because the method fliton attempts to return two values模拟考题模拟考题 Answer to Question 60)2)The program will run and output only flitonThis question tests your knowledge of the principle that the finally clause will almost always ru
17、n.输入/输出处理java.io包字节流从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。字符流从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。字节流InputStream、OutputStreamFileInputStream、FileOutputStreamPipedInputStream、PipedOutputStreamByteArrayInputStream、ByteArrayOutputStreamFilterInputStream、FilterOutputStrea
18、mDataInputStream、DataOutputStreamBufferedInputStream、BufferedOutputStream字符流Reader、WriterInputStreamReader、OutputStreamWriterFileReader、FileWriterCharArrayReader、CharArrayWriterPipedReader、PipedWriterFilterReader、FilterWriterBufferedReader、BufferedWriterStringReader、StringWriter对象流ObjectInputStream、
19、ObjectOutputStream其它文件处理File、RandomAccessFile;接口DataInput、DataOutput、ObjectInput、ObjectOutput;I/O处理的类层次可参考帮助文档,查看带input、output字样的类的继承关系,以及带reader、writer字样的类的继承关系。InputStream从流中读取数据int read();int read(byte b );int read(byte b,int off,int len);int available();long skip(long n);InputStream关闭流close();使用
20、输入流中的标记void mark(int readlimit);void reset();boolean markSupported();OutputStream输出数据void write(int b);void write(byte b );void write(byte b,int off,int len);flush()刷空输出流,并输出所有被缓存的字节。关闭流close();文件处理File、FileInputStream、FileOutputStream、RamdomAccessFile文件描述类File提供了一种与机器无关的方式来描述一个文件对象的属性。文件的生成public F
21、ile(String path);public File(String path,String name);public File(File dir,String name);文件描述文件名的处理String getName();/*得得到到一一个个文文件件的的名名称称(不不包包括路径)括路径)*/String getPath();/得到一个文件的路径名得到一个文件的路径名String getAbsolutePath();/*得得到到一一个个文文件件的的绝绝对对路径名路径名*/String getParent();/*得到一个文件的上一级目得到一个文件的上一级目录名录名*/String ren
22、ameTo(File newName);/*将当前文件将当前文件名更名为给定文件的完整路径名更名为给定文件的完整路径*/文件描述文件属性测试boolean exists();/*测试当前测试当前File对象所指示的对象所指示的文件是否存在文件是否存在*/boolean canWrite();/测试当前文件是否可写测试当前文件是否可写boolean canRead();/测试当前文件是否可读测试当前文件是否可读boolean isFile();/*测试当前文件是否是文件测试当前文件是否是文件(不是目录)(不是目录)*/boolean isDirectory();/*测测试试当当前前文文件件是是否
23、否是是目目录录*/文件描述普通文件信息和工具long lastModified();/*得到文件最近一次修改得到文件最近一次修改的的时间时间*/long length();/得到文件的长度,以字节为单位得到文件的长度,以字节为单位boolean delete();/删除当前文件删除当前文件目录操作boolean mkdir();/*根据当前对象生成一个由根据当前对象生成一个由该该对象指定的路径对象指定的路径*/String list();/列出当前目录下的文件列出当前目录下的文件文件处理例子例10.1 (参见FileTest.java文件)文件处理例子列出目录中与某种模式相匹配的文件:publ
24、ic String list(FilenameFilter filter);在接口 FilenameFilter中定义的方法只有:boolean accept(File dir,String name);例10.2(参见FileFilterTest.java文件)文件的顺序处理类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。FileInputStream fis;try fis=new FileInputStream(text);System.out.print(content of te
25、xt is:);int b;while(b=fis.read()!=-1)System.out.print(char)b);catch(FileNotFoundException e)System.out.println(e);catch(IOException e)System.out.println(e);过滤流/过程流处理流包装类过程流在其它流之上,完成排序、变换等操作。过程流也被称做过滤流。当你需要改变输入流的原始数据时,你可以将一个过滤输入流连接到一个原始的输入流上。用过滤流将原始数据变换成你需要的格式。过滤流在读/写数据的同时可以对数据进行处理将其他数据类型转换成字节数组,然后调用
26、底层的节点流。它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。输入、输出流的体系结构 I/O流的链 DataSourceFileInputStreamBufferedInputStreamDataInputStreamProgramDataSinkFileOutputStreamBufferedOutputStreamDataOutputStreamProgram一个输入流链一个输出流链 过滤流为了使用一
27、个过滤流,必须首先把过滤流连接到某个输入/出流上,通常通过在构造方法的参数中指定所要连接的输入/出流来实现。例如:FilterInputStream(InputStream in);FilterOutputStream(OutputStream out);过滤流缓冲流BufferedInputStream和BufferedOutputStream缓冲流,利用缓冲区进行输入输出可以明显提缓冲流,利用缓冲区进行输入输出可以明显提高输入高输入/输出处理的效率。输出处理的效率。java.lang.Object|+-java.io.InputStream|+-java.io.FilterInputStr
28、eam|+-java.io.BufferedInputStream过滤流数据流处理基本数据类型数据的读写操作DataInputStream 和 DataOutputStream可以以与机器无关的格式读取各种类型的数据。public class DataInputStream extends FilterInputStream implements DataInput接口DataInput中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean()、readInt()、readLine()、readFully()等。接口DataOutput
29、中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar()、writeDouble()、write()等。过滤流DataInputStreambytereadByte()longreadLong()doublereadDouble()DataOutputStreamvoidwriteByte(byte)voidwriteLong(long)voidwriteDouble(double)过滤流LineNumberInputStream除了提供对输入处理的支持外,LineNumberInputStream可以记录当前的行号。PushbackInputStre
30、am提供了一个方法可以把刚读过的字节退回到输入流中。PrintStream打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流。过滤流例10.5 (参见getIdentifier.java文件)I/O异常进行I/O操作时可能会产生I/O异常,属于非运行时异常,应该在程序中处理。如:FileNotFoundException,EOFException,IOException流结束的判断read()返回-1。readXXX()readInt()、readByte()、readLong()、readDouble()等;产生EOFException。readLine()返回null。
31、随机存取文件随机存取文件public class RandomAccessFileextends Objectimplements DataInput,DataOutput接口DataInput中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean()、readInt()、readLine()、readFully()等。接口DataOutput中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar()、writeDouble()、write()等。随机存取文件随机存取文件构造方法:构造方法:Ran
32、domAccessFile(String name,String mode);RandomAccessFile(File file,String mode);文件指针的操作文件指针的操作long getFilePointer();void seek(long pos);int skipBytes(int n);随机存取文件随机存取文件例10.4 (参见TheRandomAccessFile.java文件)字符流java.io包中提供了专门用于字符流处理的类(以Reader和Writer为基础派生出的一系列类)。Reader和Writer这两个类是抽象类,只是提供了一系列用于字符流处理的接口,不
33、能生成这两个类的实例,只能通过使用由它们派生出来的子类对象来处理字符流。ReaderReader类是处理所有字符流输入类的父类。读取字符public int read()throws IOException;public int read(char cbuf)throws IOException;public abstract int read(char cbuf,int off,int len)throws IOException;Reader标记流public boolean markSupported();public void mark(int readAheadLimit)throw
34、s IOException;public void reset()throws IOException;关闭流public abstract void close()throws IOException;WriterWriter类是处理所有字符流输出类的父类。向输出流写入字符public void write(int c)throws IOException;public void write(char cbuf)throws IOException;public abstract void write(char cbuf,int off,int len)throws IOException;
35、public void write(String str)throws IOException;public void write(String str,int off,int len)throws IOException;Writerflush()刷空输出流,并输出所有被缓存的字节。关闭流public abstract void close()throws IOException;InputStreamReader和OutputStreamWriterjava.io包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介。InputStreamReader和OutputStreamW
36、riter生成流对象public InputStreamReader(InputStream in);public InputStreamReader(InputStream in,String enc)throws UnsupportedEncodingException;public OutputStreamWriter(OutputStream out);public OutputStreamWriter(OutputStream out,String enc)throws UnsupportedEncodingException;InputStreamReader和OutputStre
37、amWriter读入和写出字符基本同Reader和Writer。获取当前编码方式public String getEncoding();关闭流public void close()throws IOException;BufferedReader和BufferedWriter生成流对象public BufferedReader(Reader in);public BufferedReader(Reader in,int sz);public BufferedWriter(Writer out);public BufferedWriter(Writer out,int sz);BufferedR
38、eader和BufferedWriter读入/写出字符除了Reader和Writer中提供的基本的读写方法外,增加对整行字符的处理。public String readLine()throws IOException;public void newLine()throws IOException;import java.io.*;public class CharInput public static void main(String args)throws FileNotFoundException,IOException String s;FileInputStream is;InputS
39、treamReader ir;BufferedReader in;is=new FileInputStream(“test.txt”);ir=new InputStreamReader(is);in=new BufferedReader(ir);while(s=in.readLine()!=null)System.out.println(Read:+s);运行结果如下:Read:java is a platform independentRead:programming languageRead:it is aRead:object oriented language.从键盘接收输入的数据In
40、putStreamReader ir;BufferedReader in;ir=new InputStreamReader(System.in);in=new BufferedReader(ir);String s=in.readLine();System.out.println(“Input value is:”+s);int i=Integer.parseInt(s);/转换转换成成int型型i*=2;System.out.println(“Input value changed after doubled:”+i);模拟考题模拟考题Question 12)You have a publi
41、c class called myclass with the main method defined as follows public static void main(String parm)System.out.println(parm0);If you attempt to compile the class and run the program as followsjava myclass helloWhat will happen?模拟考题模拟考题1)Compile time error,main is not correctly defined 2)Run time erro
42、r,main is not correctly defined 3)Compilation and output of java 4)Compilation and output of hello模拟考题模拟考题Answer to Question 12)4)Compilation and output of hello注意:在读取字符流时,如果不是来自于本地的,比如说来自于网络上某处的与本地编码方式不同的机器,那么我们在构造输入流时就不能简单地使用本地缺省的编码方式,否则读出的字符就不正确;为了正确地读出异种机上的字符,我们应该使用下述方式构造输入流对象:ir=new InputStream
43、Reader(is,“8859_1”);采用ISO 8859_1编码方式,这是一种映射到ASCII码的编码方式,可以在不同平台之间正确转换字符。对象的串行化(Serialization)对象记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。串行化方法在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。定义一个可串行化对象public class Student implements S
44、erializableint id;/学号学号String name;/姓名姓名int age;/年龄年龄String department/系别系别public Student(int id,String name,int age,String department)this.id=id;this.name=name;this.age=age;this.department=department;构造对象的输入输出流java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。在ObjectInputStream中用readO
45、bject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。保存对象状态Student stu=new Student(981036,”Liu Ming”,18,“CSD”);FileOutputStream fo=new FileOutputStream(data.ser);ObjectOutputStream so=new ObjectOutputStream(fo);try so.writeObject(stu);so.close();catch(IOExceptione)System.out.println
46、(e);恢复对象状态FileInputStream fi=new FileInputStream(data.ser);ObjectInputStream si=new ObjectInputStream(fi);trystu=(Student)si.readObject();si.close();catch(IOExceptione)System.out.println(e);串行化的注意事项串行化能保存的元素只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。串行化的注意事项transient关键字对于某些类型
47、的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明。transient标志的字段不被串行化。定制串行化缺省的串行化机制,对象串行化首先写入类数据和类字段的信息,然后按照名称的上升排列顺序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。就是在类的定义中重写writeObject()和readObject()方法。例 (参见ObjectSerialization.java文件)管道流管道用来把一个程序、线程或代码块的输出连接到另一
48、个程序、线程或代码块的输入管道输入流作为一个通信管道的接收端,管道输出流作为发送端。在使用管道之前,管道输出流和管道输入流必须进行连接。管道流在构造方法中连接:PipedInputStream(PipeOutputStream src);PipedOutputStream(PipeInputStream snk);用connect()方法进行连接类PipedInputStream中定义为:void connect(PipeOutputStream src);类PipedOutputStream中定义为:void connect(PipeInputStream snk);管道流例10.8(参见文
49、件PipeStreamTest.java)内存的读写ByteArrayInputStream8位ByteArrayOutputStream8位StringBufferInputStream16位顺序输入流SequenceInputStream 把几个输入流顺序连接起来。例10.9(参见文件SequenceTest.java)模拟考题模拟考题Question 5)Which of the following are true statements?1)I/O in Java can only be performed using the Listener classes 2)The Random
50、AccessFile class allows you to move directly to any point a file.模拟考题模拟考题 3)The creation of a named instance of the File class creates a matching file in the underlying operating system only when the close method is called.4)The characteristics of an instance of the File class such as the directory