资源预览内容
第1页 / 共45页
第2页 / 共45页
第3页 / 共45页
第4页 / 共45页
第5页 / 共45页
第6页 / 共45页
第7页 / 共45页
第8页 / 共45页
第9页 / 共45页
第10页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 异常处理,8.1 异常的概念 8.2 异常的分类 8.2.1 运行时异常 8.2.2 捕获异常 8.2.3 声明异常 8.2.4 抛出异常 8.2.5 异常子类 8.7 总结,8.1 异常的概念,在Java中,提供了错误捕捉和处理机制,即异常处理机制。在程序运行过程中发生错误时,Java允许其不按照正常路径完成任务,由发现错误的方法抛出封装了错误信息的对象(异常)到其调用程序,发出已经发生问题的信号,然后立即退出;而且,程序并不在调用该方法的代码处继续执行,而是由异常处理机制开始搜索一个能够处理这种特定错误情况的异常处理器。,什么是异常? 异常实际上是程序中错误导致中断了正常的指令流的一种事件.如除0溢出,数组越界,文件找不到等。这类事件的发生将阻止程序的正常运行,为了争强程序的鲁棒性,计算机程序必须考虑程序运行时可能发生的异常时间及做出相应的处理。Java通过面向对象的方法来处理异常,即在方法运行中,如有异常发生,该方法生成代表该异常的一个对象并交给运行时系统,系统寻找相应的代码来处理这一异常。,和传统的方法比较异常的优点: 1.把错误代码从常规代码中分离出来 2. 把错误传播给调用堆栈 3. 按错误类型和 错误差别分组 4. 系统提供了对于一些无法预测的错误的捕获和处理 5. 克服了传统方法的错误信息有限的问题,没有处理错误的程序: read-file openTheFile; determine its size; allocate that much memory; closeTheFile; ,以常规方法处理错误 openFiles; if (theFilesOpen) determine the lenth of the file; if (gotTheFileLength) allocate that much memory; if (gotEnoughMemory) read the file into memory; if (readFailed) errorCode=-1; else errorCode=-2; else errorCode=-3; else errorCode=-4 ; else errorCode=-5;,观察前面的程序你会发现大部分精力花在出错处理上了. 只把能够想到的错误考虑到,对以外的情况无法处理 程序可读性差 出错返回信息量太少。,用异常的形式处理错误 read-File; try openTheFile; determine its size; allocate that much memory; closeTheFile; catch(fileopenFailed) dosomething; catch(sizeDetermineFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(readFailed) dosomething; catch(fileCloseFailed) dosomething; ,8.2处理异常的种类,异常是一个对象,它继承自Throwable类,所有的Throwable类的子孙类所产生的对象都是例外. Error:由Java虚拟机生成并抛出,Java程序不做处理. Runtime Exception(被0除等系统错误,数组下标超范围):由系统检测, 用户的Java 程序可不做处理,系统将它们交给缺省的异常处理程序. Exception(程序中的问题,可预知的): Java编译器要求Java程序必须捕获或声明所有的非运行时异常 throw:用户自己产生异常,异常的分类,.,Throwable,Error,Exception,RuntimeException,缺省的异常 处理程序,由用户捕获或 声明并处理,不做处理,用户自己产生的异常,要处理,Throwable类派生出两个分支:Error和Exception。 Error类被认为是不能恢复的严重错误,如系统内部错误和资源耗尽错误等。不应该抛出这种类型的错误,而是让程序中断。 Exception类定义可能遇到的轻微错误,分为派生自RuntimeException类的异常和非派生自RuntimeException类的异常。这时,可以写代码来处理异常并继续程序执行,而不是让程序中断。 区分RuntimeException和非RuntimeException的规则是:编程错误导致RuntimeException,如被零除、数组越界访问、空指针访问等;而其他异常则是由于意外情况而发生的,如试图读取文件结尾以后的数据、试图打开错误的URL、试图根据并不代表已存在类的字符串来查找Class对象等。,8.2.1 运行时异常,8.2.2 捕获异常,try 可能产生异常的代码 /try块 catch(ExceptionType1 e1) /要捕获的异常类型1 对此异常的处理 /异常处理1 catch(ExceptionType2 e2) /要捕获的异常类型2 对此异常的处理 /异常处理2 catch(ExceptionType3 e3) /要捕获的异常类型3 对此异常的处理 /异常处理3 ,捕获并处理异常 try /接受监视的程序块,在此区域内发生 /的异常,由catch中指定的程序处理; catch(要处理的异常种类和标识符) /处理异常; catch(要处理的异常种类和标识符) /处理异常; ,例 捕获并处理异常,/ExceptionExample.java public class ExceptionExample public static void main(String args) try /使用给定字符串“I throw an Exception!“ 作为详细信息来构造Exception对象。 throw new Exception(“I throw an Exception!“); catch(Exception e) /可以捕获所有异常类型 System.out.println(“Caught the Exception!“); /输出该对象的详细信息。 System.out.println(“e.getMessage(): “ + e.getMessage(); 运行结果如下: Caught the Exception! e.getMessage(): I throw an Exception!,Try语句用大括号 指定一段代码,该代码可能会抛出一个或多个异常。同时该代码也指定了它后面的catch语句所捕获异常的范围。 Catch语句的参数类似于方法的声明,包括一个异常类型和一个异常对象。异常类型必须为throwable类的子类,它指明了catch语句所处理的异常类型;异常对象则由运行时系统在try所指定的代码块中生成并被捕获。 Finally,try所指定的代码中,当抛出一个异常时,其后代码不会被执行,finally语句可以指定一块代码。Finlly所指定的代码都要被执行,它提供了程序统一的出口,一定会执行的程序块-finally 异常处理的统一出口 try /常规的代码; catch() /处理异常 finally /不论发生什么异常(或者不发生任何异常),都要执行的部分; ,finally在文件处理时非常有用 try 对文件进行处理的程序; catch(IOException e) /对文件异常进行处理; finally 不论是否发生异常,都关闭文件; ,4.3 捕获异常,【例8.1】异常处理 class first_exception public static void main(String args) char c; int a,b=0;int array=new int7; String s=“Hello“;,try a=1/b; catch(ArithmeticException ae) System.out.println(“Catch “+ae);,try array8=0; catch(ArrayIndexOutOfBoundsException ai) System.out.println(“Catch “+ai);,try c=s.charAt(8); catch(StringIndexOutOfBoundsException se) System.out.println(“Catch “+se);,常见的异常 ArithmeticException 程序试图除零,用零取模会产生该异常。 ArrayIndexOutOfBandsException 访问数组中的一个非法元素时会产生 NullPointerException 程序访问一个空对象中的变量或方法,或者一个空数组中的元素则产生空指针异常,如访问长度为零的数组。 ArrayStoreException IOException FileNotFoundException MalformedURLException NumberFormatException OutOfMemoryException,8.2.3 声明异常,一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常. 声明异常的方法 在产生异常的方法名后面加上要抛出(throws)的异常的列表 void compute(int x)throws ArithmeticException returnType methodName(parameterlist) throws exceptionList,简单实例,public method1() int x; try x=System.in.read(); compute(x); catch(IOException ioe) System.out.println(“read error”); catch(ArithmeticException e) System.out.println(“devided by 0”); ,public int compute(int x) throws (ArithmeticException e) return z=100/x;,4.4 声明异常,例:说出程序执行结果 public class exception1 void Proc(int sel) throws ArithmeticException, ArrayIndexOutOfBoundsException System.out.println(“In Situation“ + sel ); if (sel=0) System.out.println(“no Exception caught“); return; else if(sel=1) int iArray=new int4; iArray10=3; ,public static void main(String args) try Proc(0); Proc(1); catch(ArrayIndexOutOfBoundsException e) System.out.println(“Catch“+e); ,c:jview throwsException
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号