• 1. 第四篇 Java语言基础类
  • 2. 第八章 异常 第九章 字符串 第十章 线程第四篇 Java语言基础类
  • 3. 8.1 异常的概念 8.2 异常的分类 8.3 创建异常类型 8.4 throw 8.5 throws子句 8.6 try、catch和finally 8.7 何时使用异常 8.8 小结第八章 异常
  • 4. 【课前思考】 ◇ 什么是异常?Java中对异常的处理机制是什么?   【学习目标】 ◇ 本讲主要讲述了Java语言中的独特的异常处理机制,通过本讲的学习,同学们可以编写更为完善的Java程序。 【学习指南】   ◇ 仔细阅读本章各知识点的内容, 深刻理解Java语言中独特的例外处理机制,掌握处理问题的方法,多练习,多上机。 【难 重 点】 ◇ 重点:在编写程序时,要正确地使用捕获异常和声明抛弃异常的两种异常处理的方法。 ◇ 难点:如何使用Java中的异常处理机制,自定义异常类型与系统已提供的异常类型的区别与联系。8.1 异常的概念
  • 5. 什么是异常 定义:在程序的运行过程中所发生的异常事件,它中断指令的正常执行。   Java中提供了一种独特的异常处理机制。 没有处理错误的程序 3. 以常规方法处理错误 8.1 异常的概念 read-file { openTheFile; determine its size; allocate that much memory; read the file into memory; statement; closeTheFile; } openFiles; if (theFilesOpen) { determine the lenth of the file; if (gotTheFileLength){ allocate that much memory; if (gotEnoughMemory) { read the file into memory; if (readSuccess){ statement; if(closeTheFile) closeFile; else errorCode=-1; }else errorCode=-2; }else errorCode=-3; }else errorCode=-4; }else errorCode=-5; 缺点
  • 6. 不采用异常处理的缺点: 观察前面的程序你会发现大部分精力花在出错处理上 只把能够想到的错误考虑到,对以外的情况无法处理 程序可读性差 出错返回信息量太少8.1 异常的概念
  • 7. 用异常的形式处理错误8.1 异常的概念read-File; { try { openTheFile; determine its size; allocate that much memory; read the file into memory; statement; closeTheFile; } catch(fileopenFailed) { dosomething; } catch(sizeDetermineFailed) {dosomething;} catch(memoryAllocateFailed) { dosomething;} catch(readFailed) { dosomething;} catch(fileCloseFailed) { dosomething; } }和传统的方法比较异常的优点: 把错误代码从常规代码中分离出来 把错误传播给调用堆栈 按错误类型和错误差别分组 系统提供了对于一些无法预测的错误的捕获和处理 克服了传统方法的错误信息有限的问题method1method2method3method4产生异常传 递处理异常
  • 8. JDK的每个包中都定义了异常类,都继承自Throwable类,该类的任一扩展类所实例化的对象都称为异常对象。8.2 异常的分类类型定义举例Error由Java虚拟机生成并抛出,描述Java运行时间系统内部的错误以及资源耗尽情况。Java程序不做处理。(Error情况很少出现)动态链接失败 虚拟机错误RuntimeException (运行时异常)由于编程错误,产生的便是RuntimeException错误的转型 数组越界存取 空指针访问非RuntimeException的Exception由不可预测的因素造成的异常事件。试图越过文件尾继续读取 试图打开一个形式错误的URL
  • 9. 8.2 异常的分类Throwable不做处理Error由用户捕获或声明并处理缺省的异常处理程序ExceptionRuntimeException√√非检测性异常检测性异常非检测性异常
  • 10. 例18.2 异常的分类class ExceptionDemo2 {  public static void main( String args[ ] ){             int a = 0;             System.out.println( 5/a ); //运行时异常  } }结果: C:\>javac ExceptionDemo2.java C:\>java ExceptionDemo2   java.lang.ArithmeticException: / by zero at   ExceptionDemo2.main(ExceptionDemo2.java:4)说明:因为除数不能为0,所以在程序运行的时候出现了除0溢出的异常事件。
  • 11. 如果Java内建的异常类无法满足程序的要求,那么就需要创建自己的异常。 需要将异常类从Exception中继承出来,或从Exception的一个子类继承,如IOException。 例2 :用一个新的属性值替换一个制定属性的当前值,如果该属性名不存在,替换不合理,引发一个异常。8.3 创建异常类型class MyException extends Exception {….} public class NoSuchAttributeException extends Exception { public String attrName; public NoSuchAttributeException (String name) { super("No attribute named \"" + name + "\" found"); attrName = name; } }
  • 12. throw : 引发一个异常对象。在Java程序的执行过程中,如果出现了异常事件,就会产生一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为引发(throw)异常。引发有时也称为抛出。 throw ExceptionObject;8.4 throwthrow new NoSuchAttributeException ( );A methodExceptionAnother methodthrowcaughtpublic void replaceValue(String name, Object newValue) throws NoSuchAttributeException { Attr attr = find (name); // look up the attr if (attr == null) // it isn’t found throw new NoSuchAttributeException(name); attr.setValue(newValue); }引发异常的两种途径: 在方法或构造器中,自己通过throw语句引发异常 调用可引发某种异常的方法或构造器
  • 13. 定义:说明一个方法可引发的一组检测性异常。它包含一个用逗号分隔的异常类型表。 功能:使方法或构造器的调用者知道,调用可能返回正常结果,也可能得到异常结果。 只有在方法中未被捕获的异常才必须列出。8.5 throws子句public void replaceValue(String name, Object newValue) throws NoSuchAttributeException { Attr attr = find (name); // look up the attr if (attr == null) // it isn’t found throw new NoSuchAttributeException(name); attr.setValue(newValue); }
  • 14. 只有throws子句说明过的异常类型才可以被引发。 若方法没有throws子句,则说明不能引发异常。 当调用一个在其throws子句中列出了检测异常的方法时,有以下3种选择: 捕获并处理该异常。 捕获并映射到自己的一个异常,即引发一个在自己的throws子句中说明的异常。 在自己的throws子句中说明该异常,并使该异常通过。8.5 throws子句
  • 15. try-catch-finally语句:实现捕获并处理异常。 捕获异常的第一步是用try{…}选定捕获异常的范围,由try所限定的代码块中的语句在执行过程中可能会生异常对象并throw(抛出)。 捕获异常的第二步:在catch块中是对异常对象进行处理的代码,每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所产生的异常事件。 捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。8.6 try、catch和finally try{ statements1 //接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理 }catch (exception_type1 identifier1){ //要处理的异常类型和标识符 statements2 //处理异常 }catch (exception_type2 identifier2){ //要处理的异常类型和标识符 statements3 //处理异常 ...... }finally{ statements4 }
  • 16. 例子3,处理replaceValue引发的异常8.6 try、catch和finally Object value = new Integer(8); try{ attributedObj.replaceValue("Age", value); }catch (NoSuchAttributeException e) { // shouldn't happen, but recover if it does Attr attr = new Attr(e.attrName, value); attributeObj.add(attr); }
  • 17. 捕获异常对象的顺序和catch语句的顺序有关,当捕获到一个异常对象时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常对象,然后再逐渐一般化。即先安排子类,再安排父类。 若引发的异常与catch中的异常类型或超类类型都不匹配,该异常将被转送到调用这个方法的代码。8.6 try、catch和finally class SuperException extends Exception { } class SubException extends SuperException { } class BadCatch { public void goodTry() { /* This is an INVALID catch ordering */ try { throw new SubException(); } catch (SuperException superRef) { // Catches both SuperException and SubException } catch (SubException subRef) { // This would never be reached } } }
  • 18. finally:用来清理 内部状态或释放非对象资源。 finally子句可用来对break、continue和return进行清理。不论执行何种控制转移语句,finally子句都被执行。 finally在文件处理时非常有用 若在finally块中重建了结束原因,则该原因取代原先的原因,以前原因被遗忘。8.6.1 finallytry { 对文件进行处理的程序; }catch(IOException e) { //对文件异常进行处理; }finally { 不论是否发生异常,都关闭文件; } try { // ... do something ... return 1; } finally { return 2 }
  • 19. 在不知结束条件时,通过异常来检测8.7 何时使用异常 while ((token = stream.next()) != Stream.END) process(token); stream.close();try { for (;;) { process(stream.next()); } } catch (StreamEndException e) { stream.close(); }
  • 20. 异常Exception是一个类,程序运行时,发生的每个异常都是具体的对象。 一个方法用throws子句说明可引发多种类型的异常。 异常的类需先设计好,扩展于Exception,修饰以public,并含有适当的域和构造器;在调用时,用try-catch-finally来捕获这些类型的异常。 一般格式:正常程序和出错处理分离开来 8.8 小结try { Java statement; }catch(ExceptionType1 ExceptionObject) { Exception1 handling; } catch(ExceptionType2 ExceptionObject) { Exception2 handling; }…. }finally { final handling; // (统一的出口,最终必定要执行) }}
  • 21. 把异常传播给堆栈,沿着被调用的顺序往前寻找,只要找到符合该异常种类彻底异常处理程序,就交给这部分程序去处理 异常可以是系统已经定义好的,也可以是用户自己定义的 8.8 小结Method1 Method2 Method3 Read-file callcallcallTry catch 产生异常 throwsthrowsthrows
  • 22. 作业当用户按“T”或“t”时,人为抛出一个异常,处理 方式为打印出错信息