第5章异常处理与输入输出异常处理输入输出一、异常异常指的是程序运行过程中出现的非正常事件。其中非正常事件指的是被0除、用户输入出错、找不到文件等异常指的是运行错误,编译错误不是异常Java对异常的处理1.提供大量的异常类(1)Java预定义了很多Exception类和Error类及其大量的子类来描述异常。这些类都是Throwable类的子类。(2)Java的异常类分为运行时异常类:继承RuntimeException的类非运行时异常类:除RuntimeException类及其子类外见教材p1312.异常处理方式(1)系统自动处理一旦程序中出现异常,运行时系统将会自动产生一个相应的异常类对象,每一个异常事件都由一个异常对象来描述。publicclassExceptionExample{staticintnum;publicstaticvoidmain(Stringargs[]){num=Integer.parseInt(args[0]);System.out.println(100整除+num+=+100/num);}}本程序若输入num值为0,则产生ArithmeticException异常类对象(2)程序员主动干预异常运用异常处理机制对可能出现的异常进行干预,干预手段两种:a.使用try…catch…finally结构对异常进行捕获和处理b.通过throw或throws关键字将异常抛出。a.使用try…catch…finally结构对异常进行捕获和处理其语法格式:try{//程序代码(可能导致异常的代码)}catch(异常类类型1对象名1){//程序代码}catch(异常类类型2对象名2){//程序代码}…finally{//程序代码}说明请见教材p133例:利用try…catch…finally结构捕获ExceptionExample类中所有的异常publicclassExceptionExample{staticintnum;publicstaticvoidmain(Stringargs[]){try{num=Integer.parseInt(args[0]);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的情况publicclassExceptionDemo{staticintnum;publicstaticvoidmain(Stringargs[]){try{num=Integer.parseInt(args[0]);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方法时,捕获其抛出的异常。classExceptionDemo{publicstaticvoidDivMethod(intnum)throwsNumberFormatException,ArithmeticException,ArrayIndexOutOfBoundsException{System.out.println(100整除+num+=+100/num);}}publicclassMyDemo{publicstaticvoidmain(Stringargs[]){try{intn;n=Integer.parseInt(args[0]);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类。同时要求捕获所有可能出现的异常。自定义的异常:classInputExceptionextendsException{publicInputException(){}publicInputException(Stringstr){super(str);}}publicclassScores{publicstaticvoidmain(Stringargs[]){try{floatscore;System.out.println(请输入成绩值!)score=Math.abs(Float.parseFloat(args[0]));if(score0||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)输入流和输出流的流向键盘磁盘文件内存......控制台磁盘文件打印机......Java程序输入流输出流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("c:\\jdk\\myjava");Filemyfile=newFile(“c:\\jdk\\myjava\\MyJava.class");创建的对象myfile表示c:\jdk\myjava目录中的文件MyJava.class。(2)File(Fileparent,Stringchild);该构造方法用一个已经创建的对应于某个目录的File类对象,作为路径参数来创建File类对象,如:FileMyFile=newFile("c:\\jdk\\myjava");FileMyFile1=newFile(MyFile,"MyJava.java");File类的成员方法(p142表5-2)publicStringgetName()返回目录或文件名publicStringgetPath()返回目录或文件所在路径publicStringgetAbsolutePath()以字符串形式返回目录或文件的绝对路径publicStringgetParent()以字符串形式返回目录或文件的父目录……例:请显示c盘中的所有内容importjava.io.*;classListFileName{publicstaticvoidmain(String[]args){String[]allname;Filemyfile1=newFile(c:\\);if(myfile1.isDirectory()){allname=myfile1.list();if(allname.length==0){System.out.println(“该目录下没有任何内容!);}else{System.out.println(“该目录下的内容有:);for(inti=0;iallname.length;i++)System.out.println(allname[i]);}}elseSystem.out.println(不存在该目录);}}例:创建文件和目录importjava.io.*;classCMFileObject{publicstaticvoidmain(String[]args){try{Filemyfile1=newFile(c:\\myjdk);Filemyfile2=newFile(myfile1,YouJava.java);System.out.println(两个对象创建完毕!);if(myfile1.exists())System.out.println(myfile1+存在!);else{myfile1.mkdir();System.out.println(myfile1+已创建!);}if(myfile2.exists())System.out.println(myfile2+存在!);else{System.out.println(myf