JAVA教程 第四讲 Java的例外处理和IO流.docx

上传人:b****5 文档编号:30631063 上传时间:2023-08-18 格式:DOCX 页数:22 大小:26.73KB
下载 相关 举报
JAVA教程 第四讲 Java的例外处理和IO流.docx_第1页
第1页 / 共22页
JAVA教程 第四讲 Java的例外处理和IO流.docx_第2页
第2页 / 共22页
JAVA教程 第四讲 Java的例外处理和IO流.docx_第3页
第3页 / 共22页
JAVA教程 第四讲 Java的例外处理和IO流.docx_第4页
第4页 / 共22页
JAVA教程 第四讲 Java的例外处理和IO流.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

JAVA教程 第四讲 Java的例外处理和IO流.docx

《JAVA教程 第四讲 Java的例外处理和IO流.docx》由会员分享,可在线阅读,更多相关《JAVA教程 第四讲 Java的例外处理和IO流.docx(22页珍藏版)》请在冰豆网上搜索。

JAVA教程 第四讲 Java的例外处理和IO流.docx

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

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.java

C:

\>javaExceptionDemo2

  java.lang.ArithmeticException:

/byzeroat

  ExceptionDemo2.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程序不应该捕获这类例外,也不会抛弃这种例外。

  Exception

  

  1)运行时例外:

 

  继承于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[])throws 

  IOException,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、BufferedOutputStream

 2.字符流:

  从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。

  ◇Reader、Writer

  ◇InputStreamReader、OutputStreamWriter

  ◇FileReader、FileWriter

  ◇CharArrayReader、CharArrayWriter

  ◇PipedReader、PipedWriter

  ◇FilterReader、FilterWriter

  ◇BufferedReader、BufferedWriter

  ◇StringReader、StringWriter

 3.对象流

  ◇ObjectInputStream、ObjectOutputStream

 4.其它

  ◇文件处理:

  File、RandomAccessFile;

  ◇接口

  DataInput、DataOutput、ObjectInput、ObjectOutput;

4.4.2InputStream和OutputStream

 1.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);  //往流中写一个字节b

  voidwrite(byteb[]); //往流中写一个字节数组b

  voidwrite(byteb[],intoff,intlen); //把字节数组b中从

              //下标off开始,长度为len的字节写入流中

  ◇flush()      //刷空输出流,并输出所有被缓存的字节

  由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。

  ◇关闭流:

  close();       //流操作完毕后必须关闭

4.4.3I/O中的例外

  进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。

如:

FileNotFoundException,EOFException,IOException

4.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是文件名

 ◇文件名的处理

  StringgetName(); //得到一个文件的名称(不包括路径)

  StringgetPath(); //得到一个文件的路径名

  StringgetAbsolutePath();//得到一个文件的绝对路径名

  StringgetParent(); //得到一个文件的上一级目录名

  StringrenameTo(FilenewName); //将当前文件名更名为给定文件的

                  完整路径

 ◇文件属性测试

  booleanexists(); //测试当前File对象所指示的文件是否存在

  booleancanWrite();//测试当前文件是否可写

  booleancanRead();//测试当前文件是否可读

  booleanisFile(); //测试当前文件是否是文件(不是目录)

  booleanisDirectory(); //测试当前文件是否是目录

 ◇普通文件信息和工具

  longlastModified();//得到文件最近一次修改的时间

  longlength(); //得到文件的长度,以字节为单位

  booleandelete(); //删除当前文件

 ◇目录操作

  booleanmkdir(); //根据当前对象生成一个由该对象指定的路径

  Stringlist(); //列出当前目录下的文件

 【例4-3】

  importjava.io.*; //引入java.io包中所有的类

  publicclassFileFilterTest{

    publicstaticvoidmain(Stringargs[]){

     Filedir=newFile("d:

//ex"); //用File对象表示一个目录

     Filterfilter=newFilter("java"); //生成一个名为java的过滤器

     System.out.println("listjavafilesindirectory"+dir);

     Stringfiles[]=dir.list(filter); //列出目录dir下,文件后缀名

                      为java的所有文件

     for(inti=0;i

      Filef=newFile(dir,files[i]); //为目录dir下的文件或目录

                      创建一个File对象

       if(f.isFile()) //如果该对象为后缀为java的文件,

               则打印文件名

        System.out.println("file"+f);

       else 

        System.out.println("subdirectory"+f); //如果是目录

                            则打印目录名

     }

    }

   }

   classFilterimplementsFilenameFilter{

    Stringextent;

    Filter(Stringextent){

     this.extent=extent;

    }

    publicbooleanaccept(Filedir,Stringname){

     returnname.endsWith("."+extent); //返回文件的后缀名

    }

   }

4.5.2文件的顺序处理

  类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。

例如,下列的语句段是顺序读取文件名为text的文件里的内容,并显示在控制台上面,直到文件结束为止。

  FileInputStreamfis; 

  try{

    fis=newFileInputStream("text");

  System.out.print("contentoftextis:

");

     intb;

     while((b=fis.read())!

=-1) //顺序读取文件text里的内容并赋值

                    给整型变量b,直到文件结束为止。

 

     {             

       System.out.print((char)b);

     }

  }catch(FileNotFoundExceptione){

  System.out.println(e);

  }catch(IOExceptione){

  System.out.println(e);

  }

4.5.3随机访问文件

  对于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。

随机访问文件则允许对文件内容进行随机读/写。

在java中,类RandomAccessFile提供了随机访问文件的方法。

类RandomAccessFile的声明为:

publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutput

  接口DataInput中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。

如:

readBoolean()、readInt()、readLine()、readFully()等。

 

  接口DataOutput中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。

如:

writeChar()、writeDouble()、write()等。

下面详细介绍RandomAccessFile类中的方法。

 ◇构造方法:

  RandomAccessFile(Stringname,Stringmode); //name是文件名,mode

          //是打开方式,例如"r"表示只读,"rw"表示可读写,"

  RandomAccessFile(Filefile,Stringmode); //file是文件对象

 ◇文件指针的操作

  longgetFilePointer(); //用于得到当前的文件指针

  voidseek(longpos); //用于移动文件指针到指定的位置

  intskipBytes(intn); //使文件指针向前移动指定的n个字节

4.6过滤流

  过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。

类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类

 过滤流类层次:

         java.lang.Object

               |

               +----java.io.InputStream

                         |

                         +----java.io.FilterInputStream

  为了使用一个过滤流,必须首先把过滤流连接到某个输入/出流上,通常通过在构造方法的参数中指定所要连接的输入/出流来实现。

例如:

  FilterInputStream(InputStreamin);

  FilterOutputStream(OutputStreamout);

4.6.1几种常见的过滤流

  ◇BufferedInputStream和BufferedOutputStream

   缓冲流,用于提高输入/输出处理的效率。

  ◇DataInputStream和DataOutputStream

   不仅能读/写数据流,而且能读/写各种的java语言的基本类型,如:

boolean,int,float等。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1