第5章 异常处理与输入输出_第1页
第5章 异常处理与输入输出_第2页
第5章 异常处理与输入输出_第3页
第5章 异常处理与输入输出_第4页
第5章 异常处理与输入输出_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

第5章异常处理与输入输出,异常处理输入输出,一、异常,异常指的是程序运行过程中出现的非正常事件。其中非正常事件指的是被0除、用户输入出错、找不到文件等异常指的是运行错误,编译错误不是异常,Java对异常的处理1.提供大量的异常类(1)Java预定义了很多Exception类和Error类及其大量的子类来描述异常。这些类都是Throwable类的子类。(2)Java的异常类分为运行时异常类:继承RuntimeException的类非运行时异常类:除RuntimeException类及其子类外见教材p131,2.异常处理方式(1)系统自动处理一旦程序中出现异常,运行时系统将会自动产生一个相应的异常类对象,每一个异常事件都由一个异常对象来描述。publicclassExceptionExamplestaticintnum;publicstaticvoidmain(Stringargs)num=Integer.parseInt(args0);System.out.println(100整除+num+=+100/num);本程序若输入num值为0,则产生ArithmeticException异常类对象,(2)程序员主动干预异常运用异常处理机制对可能出现的异常进行干预,干预手段两种:a.使用trycatchfinally结构对异常进行捕获和处理b.通过throw或throws关键字将异常抛出。,a.使用trycatchfinally结构对异常进行捕获和处理其语法格式:try/程序代码(可能导致异常的代码)catch(异常类类型1对象名1)/程序代码catch(异常类类型2对象名2)/程序代码finally/程序代码说明请见教材p133,例:利用trycatchfinally结构捕获ExceptionExample类中所有的异常,publicclassExceptionExamplestaticintnum;publicstaticvoidmain(Stringargs)trynum=Integer.parseInt(args0);System.out.println(100整除+num+=+100/num);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(你还没有输入呢,请输入整数值!);catch(NumberFormatExceptione)System.out.println(你输入的是小数或字符,请输入整数值!);catch(ArithmeticExceptione)System.out.println(你输入的是0,请输入非0整数值!);,b.通过throw或throws关键字将异常抛出(a)利用throw关键字直接抛出异常在编写程序的过程中,对可能会引发异常的地方直接使用throw语句自行抛出,当直接利用throw语句抛出异常时,一定要对抛出的异常进行捕获。语法格式:thrownew异常类类型(信息)其中异常类类型为系统异常类名或用户自定义的异常类名。toString方法可返回上面的信息内容,例:直接抛出异常以处理分母输入为0的情况publicclassExceptionDemostaticintnum;publicstaticvoidmain(Stringargs)trynum=Integer.parseInt(args0);if(num=0)thrownewArithmeticException(你应该输入非0整数值!);System.out.println(100整除+num+=+100/num);,catch(ArrayIndexOutOfBoundsExceptione)System.out.println(你还没有输入呢,请输入整数值!);catch(NumberFormatExceptione)System.out.println(你输入的是小数或字符,请输入整数值!);catch(ArithmeticExceptione)System.out.println(错误类型:+e.toString();,(b)利用throws关键字间接抛出异常在方法的声明处,利用throws关键字抛出异常。语法格式如下:方法名()throws异常类异常类1,异常类2,,例:ExceptionDemo类中的DivMethod方法计算100/num的值,并在该方法中抛出异常。MyDemo类调用DivMethod方法时,捕获其抛出的异常。classExceptionDemopublicstaticvoidDivMethod(intnum)throwsNumberFormatException,ArithmeticException,ArrayIndexOutOfBoundsExceptionSystem.out.println(100整除+num+=+100/num);,publicclassMyDemopublicstaticvoidmain(Stringargs)tryintn;n=Integer.parseInt(args0);ExceptionDemo.DivMethod(n);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(你还没有输入呢,请输入整数值!);catch(NumberFormatExceptione)System.out.println(你输入的是小数或字符,请输入整数值!);catch(ArithmeticExceptione)System.out.println(你输入的是0,请输入非0整数值!);,三、自定义异常,语法结构:class自定义异常类名extendsException(Throwable)public自定义异常类名()public自定义异常类名(Stringstr)super(str);用throw语句来抛出自定义的异常类,,例:要求在命令行后输入学生成绩,成绩值在0,100之间。当输入的数值不在0,100之间时,直接抛出自定义的异常类InputException类。同时要求捕获所有可能出现的异常。自定义的异常:classInputExceptionextendsExceptionpublicInputException()publicInputException(Stringstr)super(str);,publicclassScorespublicstaticvoidmain(Stringargs)tryfloatscore;System.out.println(请输入成绩值!)score=Math.abs(Float.parseFloat(args0);if(score=100)thrownewInputException();System.out.println(你输入的成绩值:+score);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(你还没有输入呢,请输入成绩值!);catch(NumberFormatExceptione)System.out.println(你输入的是字符,请输入数值!);catch(InputExceptione)System.out.println(你输入的数值不在指定范围内,请输入0,100之间的值!);,输入输出,数据的输入输出是程序的主要任务。进行程序设计时,有时需将结果保存到指定的文件、数据库中等等。,Java语言的输入输出数据是以流(Stream)的形式出现的。流分为输入流(InputStream)和输出流(OutputStream)输入流和输出流的流向,1.JavaI/O系统,Java程序的输入和输出是由JavaI/O系统负责处理的I/O类库位于java.io包中,2.几个重要的居于java.io包中类层次顶部的流类,类说明File支持文件与目录操作的类InputStream字节输入流类OutputStream字节输出流类Reader字符输入流类Writer字符输出流类RandomAccessFile随机访问文件类,3.文件管理类(File),Java中的File类是专门对目录和文件进行管理的类对目录的管理包括建立目录、删除目录、重命名目录以及建立与删除临时目录;对文件的管理包括建立空文件、删除文件、重命名文件、获取或修改文件的各种属性以及建立与删除临时文件。Java中的File类是不能读写文件的。,File类的构造方法,File(Stringpathname)该构造方法中的参数pathname,指定所创建的File类对象对应的目录或文件Filemyfile=newFile(:jdkmyjava);Filemyfile=newFile(“c:jdkmyjavaMyJava.class);创建的对象myfile表示:jdkmyjava目录中的文件MyJava.class。,(2)File(Fileparent,Stringchild);该构造方法用一个已经创建的对应于某个目录的File类对象,作为路径参数来创建File类对象,如:FileMyFile=newFile(:jdkmyjava);FileMyFile1=newFile(MyFile,MyJava.java);,File类的成员方法(p142表5-2),publicStringgetName()返回目录或文件名publicStringgetPath()返回目录或文件所在路径publicStringgetAbsolutePath()以字符串形式返回目录或文件的绝对路径publicStringgetParent()以字符串形式返回目录或文件的父目录,例:请显示c盘中的所有内容,importjava.io.*;classListFileNamepublicstaticvoidmain(Stringargs)Stringallname;Filemyfile1=newFile(c:);if(myfile1.isDirectory()allname=myfile1.list();if(allname.length=0)System.out.println(“该目录下没有任何内容!);elseSystem.out.println(“该目录下的内容有:);for(inti=0;iallname.length;i+)System.out.println(allnamei);elseSystem.out.println(不存在该目录);,例:创建文件和目录,importjava.io.*;classCMFileObjectpublicstaticvoidmain(Stringargs)tryFilemyfile1=newFile(c:myjdk);Filemyfile2=newFile(myfile1,YouJava.java);System.out.println(两个对象创建完毕!);if(myfile1.exists()System.out.println(myfile1+存在!);elsemyfile1.mkdir();System.out.println(myfile1+已创建!);,if(myfile2.exists()System.out.println(myfile2+存在!);elseSystem.out.println(myfile2+文件不存在,请创建!);myfile2.createNewFile();System.out.println(myfile2+文件已创建!);catch(IOExceptione),例显示文件的一些属性,importjava.io.*;importjava.util.Date;classShowFileAttripublicstaticvoidmain(Stringargs)Filef=newFile(“myfile.txt”)if(f.exists()System.out.println(文件tt属性);System.out.println(名称:tt+f.getName();System.out.println(可读性:tt+f.canRead();System.out.println(可写性:tt+f.canWrite();System.out.println(隐藏性:tt+f.isHidden();System.out.println(长度:tt+f.length();Datedate=newDate(f.lastModified();System.out.println(最后修改日期:t+date.toString();elseSystem.out.println(f.getName()+“不存在!”);,练习(P179):,设计一个文件管理器。要求从命令行输入文件的路径(第一个参数)和文件名(第二个参数),从而实现显示文件、删除文件等基本操作。要求捕获所有的异常。,4、Java中对文件进行读写的类,字节流类字符流类文件随机读取类(RandomAccessFile),(1)字节流,字节流是指数据流中最小的数据单元是字节,它为处理字节的输入和输出提供了方便,如使用字节流读取或输出二进制数据字节流分为字节输入流和字节输出流在I/O类库中,它们分别由InputStream和OutputStream表示InputStream、OutputStream都是抽象类,不能被实例化,该类中所有的方法在出错条件下都会引发IOException异常,InputStream和OutputStream类的读写是面向字节的,其实现读/写的操作方法是read()/write()方法还有其它的方法参见教材p147149,字节输入流InputStream部分子类继承关系图,InputStream基本字节输入流FileInputStream基本文件输入流PipedInputStream用作线程通信的管道输入流ByteArrayInputStream字节数组输入流FilterInputStream在基本输入流中增加新功能的抽象输入流BufferedInputStream基本缓冲区输入流DataInputStream读取原始数据类型的输入流,利用FileInputStream实现字节流文件的顺序读取,类的构造方法如下FileInputStream(Stringname)throwsFileNotFoundException该方法中name为本地文件名,若希望程序可以从文件读取字节数据,必须创建一个FileInputStream对象与要读取的文件建立联系。,例:将ByteFileRead.java文件内容输出到屏幕上,importjava.io.*;publicclassByteFileReadpublicstaticvoidmain(Stringargs)throwsIOExceptionFileInputStreamf1=newFileInputStream(ByteFileRead.java);intdata=f1.read();while(data!=-1)System.out.print(char)data);data=f1.read();f1.close();,FileInputStream(Filefile)throwsFileNotFoundException该方法中file是文件对象,可以使用文件对象指定文件,再创建一个FileInputStream对象间接的与文件对象所指定的文件建立联系。如,可以使用文件对象指定ByteFileRead.java文件,再与文件输入流建立联系:Filef=newFile(ByteFileRead.java);FileInputStreamf1=newFileInputStream(f);然后调用不同形式的read()方法顺序读取文件ByteFileRead.java的内容,字节输出流OutputStream部分子类继承关系图,利用FileOutputStream实现字节流文件的顺序写入,该类的构造方法如下FileOutputStream(Stringname)throwsFileNotFoundException该方法中name为本地文件名,若希望程序可以将数据写入文件,必须创建一个FileOutputStream对象与要写入的文件建立联系。然后调用不同形式的write()方法向指定的文件写入数据。FileOutputStream(Stringname,booleanappend)throwsFileNotFoundException该方法中append的值为false时,以覆盖的方式向文件写入数据,否则,以追加的方式向文件写入数据。其它的同。,FileOutputStream(Filefile)throwsFileNotFoundException该方法中file是文件对象,可以使用文件对象指定文件,再创建一个FileOutputStream对象间接地与文件对象所指定的文件建立联系。如,可以使用文件对象指定ByteFileWrite.txt文件,再与文件输出流建立联系:Filef=newFile(ByteFileWrite.txt);FileOutputStreamf2=newFileOutputStream(f);然后调用不同形式的write()方法向文件ByteFileWrite.txt写入数据。FileOutputStream(Filefile,booleanappend)throwsFileNotFoundException该方法中append的值为false时,以覆盖的方式向文件写入数据,否则,以追加的方式向文件写入数据。其它的同。,例:要求从键盘输入一串字符串到指定的文件中,importjava.io.*;publicclassByteFileWritepublicstaticvoidmain(Stringargs)throwsIOExceptionbyteinChar=newbyte30;System.out.println(请输入一串字符串:);System.in.read(inChar,0,30);FileOutputStreamfos=newFileOutputStream(myfile.txt,true);fos.write(inChar);fos.close();System.out.println(写文件完毕!rn可在本程序同一目录下查看到myfile.txt文件!);,练习:,请将ByteFileRead.java文件内容拷贝到文件myfile.txt文件中。,(2)字符流,字符流是指数据流中最小的数据单元是字符。字符流分为字符输入流和字符输出流,在I/O类库中,它们分别由Reader和Writer表示。Reader、Writer都是抽象类,不能被实例化,该类中所有的方法在出错条件下都会引发IOException异常。Reader和Writer类的读写是面向字符的,其实现读/写的操作方法也是read()/write()方法。,字符输入流Reader部分子类继承关系图,Reader基本字符输入流InputStreamReader转换InputStream为Reader,可以指定数据源的字符编码FileReaderInputStreamReader类的子类,是用于从文件中读入字符流的类BufferedReader具有缓冲功能的字符输入类LineNumberReader为其它Reader提供读缓冲区,同时可以跟踪字符输入流中的行号FilterReader扩展其它Reader的功能,字符输入流Writer部分子类继承关系图,Writer基本字符输出流OutputStreamWriter转换OutputStream为Writer,可以指定数据汇的字符编码FileWriterOutputStreamWriter类的子类,是用于向文件中写入字符流的类BufferedWriter具有缓冲功能的字符输出类FilterWriter扩展其它Writer的功能。PrintWriter输出格式化数据,利用文件字符流读取文件内容,例:将ByteFileRead.java文件内容拷贝到CopyCharacterFileRead.txt新文件中importjava.io.*;publicclassCharacterFileReadpublicstaticvoidmain(Stringargs)throwsIOExceptiontryFileReaderf1=newFileReader(ByteFileRead.java);FileWriterf2=newFileWriter(CopyCharacterFileRead.doc);intdata=f1.read();while(data!=-1)f2.write(data);data=f1.read();,f1.close();f2.close();System.out.println(你已成功将ByteFileRead.java文件内容拷贝到CopyCharacterFileRead.txt文件中,rn可在本程序同一目录下查到!);catch(FileNotFoundExceptione)System.out.println(文件ByteFileRead.java不存在!);,字符输入缓冲流BufferedReader,BufferedReader类是Reader类的子类是一个字符输入缓冲流类,可以利用缓冲技术更高效的从字符输入流中读取字符数据。当程序需要从一个文件中读取数据时,我们可以通过FileReader类创建的流读取字符数据,但读取的效率不高,一次可以读取一个或多个字符,如前面的例子所示。使用基于缓冲的BufferedReader类创建的流读取数据时,可以利用该类提供的StringreadLine()方法一次读取一行字符。,构造方法,BufferedReader(ReaderinputStream)该方法创建一个默认输入缓冲区大小的输入缓冲字符流。,字符输出缓冲流BufferedWriter,BufferedWriter类是Writer类的子类是一个字符输出缓冲流类,可以利用缓冲技术更高效的向一个字符输出流中写入字符数据。该类提供了newLine()方法,每次调用向输出流写入换行符,与BufferedReader的readLine()方法相匹配。,BufferedWriter类的构造方法如下:,BufferedWriter(WriteroutputStream)该方法创建一个默认输出缓冲区大小的输出缓冲字符流。,例:字符缓冲流的应用(将ByteFileRead.java文件拷贝到CopyByteFileRead.doc文件中),importjava.io.*;publicclassIOBufferedStreampublicstaticvoidmain(Stringargs)throwsIOExceptiontryBufferedReaderbr=newBufferedReader(newFileReader(ByteFileRead.java);BufferedWriterbw=newBufferedWriter(newFileWriter(CopyByteFileRead.doc);Stringline=br.readLine();while(line!=null)bw.write(line);bw.newLine();System.out.println(line);line=br.readLine();,bw.close();br.close();System.out.println(你已成功将ByteFileRead.java文件内容拷贝到Cop

温馨提示

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

评论

0/150

提交评论