第六讲 异常(Exception)处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4、声明异常 声明异常
声明异常的方法
声明异常的方法是在产生异常的方法名后面加上要抛出 (throws)的异常的列表: retType methodName([paramlist]) throws exceptionList 如类FileInputStream中的read()方法是这样定义的: public int read() throws IOException { … } throws子句中可以同时指明多个异常,说明该方法将不对 这些异常进行处理,而是声明抛弃它们。 需要强调的是:对于非运行时异常,程序中必须要作处理, 或者捕获,或者声明抛弃;而对于运行时异常,程序中则可 不处理。
finally在文件处理时非常有用 在文件处理时非常有用 try { 对文件进行处理的程序; 对文件进行处理的程序 }catch(IOException e) { //对文件异常进行处理 对文件异常进行处理; 对文件异常进行处理 }finally { //不论是否发生异常,都关闭文件; 不论是否发生异常,都关闭文件 不论是否发生异常 }
4. 系统提供了对于一些无法预测的错误的捕获和处理 5. 克服了传统方法的错误信息有限的问题
1、异常的概念 异常的概念
异常示例: 异常示例: (1)编译时异常:在程序中必须对其进行处理, )编译时异常:在程序中必须对其进行处理, 否则编译器会指出错误。 否则编译器会指出错误。 (2)运行时异常:程序中可以不做处理,直接由 )运行时异常:程序中可以不做处理, 运行时系统来处理。 运行时系统来处理。
public class ExceptionDemo { public static void main(String args[]) { try { FileInputStream fis = new FileInputStream("test1.txt"); int b; while( (b=fis.read())!=-1 ) { System.out.print(b); } fis.close(); }catch(FileNotFoundException e){ }catch(IOException e){ … … }catch(IOException e){ }catch(FileNotFoundException e){ … … } } } }
2、异常的分类 异常的分类
用户自己产生的异常 Throwable Exception Error 不做处理 由用户捕获或 声明并处理 缺省的异常 处理程序 RuntimeException 处理
2、异常的分类 异常的分类
Error:由Java虚拟机生成并抛出,包括动态链接失败、 虚拟机错误等,Java程序不做处理。 Runtime Exception:Java虚拟机在运行时生成的异 常,如被0除等系统错误、数组下标超范围等,其产生比 较频繁,处理麻烦,对程序可读性和运行效率影响太大。 因此由系统检测, 用户可不做处理,系统将它们交给缺省 的异常处理程序(当然,必要时,用户可对其处理)。 Exception:一般程序中可预知的问题,其产生的异常 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。
3、捕获异常 捕获异常
常见的异常
ArithmeticException ArrayIndexOutOfBandsException ArrayStoreException IOException FileNotFoundException NullPointerException MalformedURLException NumberFormatException OutOfMemoryException 在使用能够产生异常的方法而没有捕获和处理, 在使用能够产生异常的方法而没有捕获和处理,程序将 不能通过编译。 不能通过编译。
1、异常的概念 异常的概念
在C语言中,通过使用if语句来判断是否出现了错误,同 时,调用函数通过被调用函数的返回值感知在被调用函数中 产生的错误事件并进行处理。但是,这种错误处理机制会导 致不少问题,因为在很多情况下需要知道错误产生的内部细 节。通常,用全局变量Errno来存储一个异常事件的类型,这 容易导致误用,因为一个Errno的值有可能在被处理前被另外 的错误覆盖掉。此外,即使最优美的C语言程序,为了处理 异常情况,也常常求助于goto语句。
4、声明异常 声明异常
如果在一个方法中生成了异常,但是该方法并不处理它 产生的异常,而是沿着调用层次向上传递,由调用它的方 法来处理这些异常,叫声明异常。 通常的情况是在该方法中并不确切知道改如何对这些异 常进行处理,比如FileNotFoundException类异常,它由 FileInputStream的构造方法产生,但在其构造方法中并不 清楚如何处理它,是终止程序的执行还是新生成一个文件, 这需要由调用它的方法来处理。
1、异常的概念 异常的概念
用异常的形式处理错误: 用异常的形式处理错误:
{ try { openTheFile; determine its size; allocate that much memory; readread-File; closeTheFile; closeTheFile } catch(fileopenFailed) catch(sizeDetermineFailed) catch(memoryAllocateFailed) catch(readFailed) catch(fileCloseFailed) }
1、异常的概念 异常的概念 没有错误处理的程序: 没有错wk.baidu.com处理的程序
{ openTheFile; determine its size; allocate that much memory; readread-file closeTheFile; }
1、异常的概念 异常的概念
以常规方法处理错误: 以常规方法处理错误:
2、异常的分类 异常的分类
一个异常是由一个对象来代表的,所有的异常都 直接或间接地继承自Throwable类。 在Java类库的每个类包中都定义了异常类,这 些异常类分成两大类:Error类及Exception类,后 者是Java程序中需要大量处理的。 除了Java类库所定义的异常类之外,用户也可 以通过继承已有的异常类来定义自己的异常类,并 在程序中使用(利用throw产生,catch捕捉)。
异常( 第六讲 异常(Exception)处理 ) 1、异常的概念 异常的概念 2、异常的分类 异常的分类 3、捕获异常 捕获异常 4、声明异常 声明异常 5、抛出异常 6、创建自己的异常
1、异常的概念 异常的概念
在进行程序设计时,错误的产生是不可避免的,如何处理 错误?把错误交给谁去处理?程序又该如何从错误中恢复? 这是任何程序设计语言都要解决的问题。 所谓错误,是在程序运行过程中发生的异常事件,比如除 0溢出、数组越界、文件找不到等,这些事件的发生将阻止程 序的正常运行。为了加强程序的鲁棒性(robust),程序设 计时,必须考虑到可能发生的异常事件并做出相应的处理。
3、捕获异常 捕获异常
try语句 捕获异常的第一步就是用try {…}语句指定了一 段代码,该段代码就是一次捕获并处理异常的范围。 在执行过程中,该段代码可能会产生并抛弃一个或 多个异常,因此,它后面的catch语句进行捕获时也 要做相应的处理。
3、捕获异常 捕获异常
catch语句
每个try语句必须伴随一个或多个catch语句,用于捕获try 代码块所产生的异常并做相应的处理。 catch语句有一个形 式参数,用于指明其所能捕获得异常类型,运行时系统通过 参数值把被抛弃的异常对象传递给catch语句。 程序设计中要根据具体的情况来选择catch语句的异常处 理类型,一般应该按照try代码块中异常可能产生的顺序及其 真正类型进行捕获和处理,尽量避免选择最一般的类型作为 catch语句中指定要捕获的类型。 当然也可以用一个catch语句处理多个异常类型,这时它 的异常类型应该是这多个异常类型的父类,但这种方式使得 在程序中不能确切判断异常的具体类型。
{ { { { {
dosomething; dosomething; dosomething; dosomething; dosomething;
} } } } }
1、异常的概念 异常的概念
和传统的方法比较,异常的优点包括 和传统的方法比较,异常的优点包括: 1.把错误代码从常规代码中分离出来 把错误代码从常规代码中分离出来 2. 把错误传播给调 调 用 用堆栈 3. 按错误类型和 错误差别分组 method4 method3 method2 method1 产生异常 传 递 处理异常
3、捕获异常 捕获异常
Java的异常处理是通过3个关键词来实现的:try-catch-finally。 用try来执行一段程序,如果出现异常,系统抛出(throws)一 个异常,可以通过它的类型来捕捉(catch)并处理它,或最后 (finally)由缺省处理器来处理。
try{ //接受监视的程序块 接受监视的程序块, //接受监视的程序块,在此区域内发生 //的异常 的异常, catch中指定的程序处理 中指定的程序处理; //的异常,由catch中指定的程序处理; }catch(要处理的异常种类和标识符 要处理的异常种类和标识符){ }catch(要处理的异常种类和标识符){ //处理异常 处理异常; //处理异常; }catch(要处理的异常种类和标识符 要处理的异常种类和标识符){ }catch(要处理的异常种类和标识符){ //处理异常 处理异常; //处理异常; } … }finally{ //最终处理 最终处理; //最终处理; }
1、异常的概念 异常的概念 观察前面的程序, 观察前面的程序,大家会发现大部分精 力花在出错处理上了 只把能够想到的错误考虑到, 只把能够想到的错误考虑到,对以外的 情况无法处理 程序可读性差 出错返回信息量太少
1、异常的概念 异常的概念
Java通过面向对象的方法来处理程序错误,在Java中, 错误被称为异常(Exception)。 在一个方法的运行过程中,如果发生了异常,则这个 方法(或者是Java虚拟机)生成一个代表该异常的对象 (包含了该异常的详细信息),并把它交给运行时系统, 运行时系统寻找相应的代码来处理这一异常。我们把生成 异常对象并把它提交给运行时系统的过程称为抛出(throw) 一个异常。 运行时系统在方法的调用栈中查找,从生成异常的方 法开始进行回朔,直到找到包含相应异常处理的方法为止, 这一个过程称为捕获(catch)一个异常。
3、捕获异常 捕获异常
finally语句
捕获异常的最后一步是通过finally语句为异常处理提供一 个统一的出口,使得在控制流程转到程序的其他部分以前, 能够对程序的状态作统一的管理。 无论try所指定的程序块中抛弃或不抛弃异常, 无论 所指定的程序块中抛弃或不抛弃异常,也无论 所指定的程序块中抛弃或不抛弃异常 catch语句的异常类型是否与所抛弃的异常的类型一致, 语句的异常类型是否与所抛弃的异常的类型一致, 语句的异常类型是否与所抛弃的异常的类型一致 finally所指定的代码都要被执行,它提供了统一的出口。 所指定的代码都要被执行, 所指定的代码都要被执行 它提供了统一的出口。 通常在finally语句中可以进行资源的清除工作,如关闭打 开的文件等。
openFiles; if (theFilesOpen) { determine the length 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;