java课件之第七章异常处理与断言(ppt)_第1页
java课件之第七章异常处理与断言(ppt)_第2页
java课件之第七章异常处理与断言(ppt)_第3页
java课件之第七章异常处理与断言(ppt)_第4页
java课件之第七章异常处理与断言(ppt)_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.1 异常与异常类 7.2 异常处理机制 7.3 创建自己的异常类 7.4 断言机制 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.1 异常与异常类 7.1.1 程序错误与异常的概念 7.1.2 Throwable类及其子类 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.1.1 程序错误与异常的概念 在程序设计中,发生错误是不可避免的。一般来 说错误可以分成三种类型: 编译错误 逻辑错误 运行时错误 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 编译错误 编译错误(syntax error)是指编写的代码不符合 Java的语法标准,这种错误往往是由于编程人员 的粗心大意所造成的。例如,程序在方法中声明 了一个变量,而后在使用之前没有初始化,这时 编译器仍然会给出提示。在Java中,只有程序不 存在任何编译错误,程序才能被编译成类文件。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 逻辑错误 逻辑错误(logic error)是指程序在设计时存在的缺 陷,或者说程序虽然能够正常运行,但其运行结 果不是设计程序的人所期望的那样。因为程序通 过了编译,而且能够正常运行,因此逻辑错误一 般很难发现。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 运行时错误 运行时错误(runtime error)也可以称为运行时异 常(Exception)。程序能够通过编译,但在运行时 也可能抛出异常或意外终止,此时说明程序中存 在运行时错误。例如程序企图打开某个不存在的 文件和整数被零除等。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 所谓异常(exception)是一种特殊的运行错误对象 ,是在程序运行过程中产生的终止程序正常运行 的事件。如数组下标越界、整数除法中零作除数 、文件找不到等都可能使程序终止运行。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 为了理解异常的概念,首先看下面的程序: public class Test public static void main(String args) int a = 5; int b = a/0; System.out.println(“a=”+a); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 该程序编译不会发生错误,可以生成Test.class 字节码文件,但运行时结果如下: C:java Test Exception in thread “main” java.lang.ArithmeticException: / by zero at Test.main (Test.java:4) 该输出内容说明程序发生了异常,第一行给出了 异常名称,第二行给出了异常发生的位置。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 当程序运行到语句int b = a/0; 时,运行时系统产 生了一个ArithmeticException异常类对象并抛出 ,运行时系统就在产生异常对象的方法中寻找处 理该异常对象的代码,若有则进入异常处理的代 码,若没有(如本例),运行时系统继续将异常对 象抛给调用该方法的方法。由于main() 方法是由 JVM调用的,所以将异常抛给了JVM,JVM在 out.err上输出异常的名称。程序的最后一行没有 执行,这说明程序运行没有正常结束。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 再看下面一个程序,试图从键盘上输入一个字符,然后输 出。 import java.io.*; public class InputChar public static void main(String args) System.out.print(“Input a char:“); char c=(char)System.in.read(); System.out.println(“c=“+c); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 当编译该程序时会出现下列编译错误: c:javac InputChar.java InputChar.java:5:unreported exception java.io.IOExceptiom; must be caught or declare to be thrown char c=(char)System.in.read(); 1 error 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 上述编译错误说明程序中发现了没有报告的异常 IOException,该异常必须捕获或声明抛出,同时 编译器指出了需要捕获异常的位置。 出现上述编译错误的原因是,read()方法在定义的 时候声明抛出了异常,因此程序中若调用该方法必 须声明抛出或捕获。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.1.2 Throwable类及其子类 Java语言的异常处理采用面向对象的方法,因此为 各种异常建立了类层次。Java异常都是Throwable 类的子类对象。Throwable类是Object类的直接子 类,它定义在java.lang包中。异常类的层次结构如 图7-1所示。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 Throwable Error Exception IOException ClassNotFoundException NoSuchMethodException RuntimeException IllegalArgumentException NullPointerException ClassCastException ArithmeticException IndexOutOfBoundsException ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException FileNotFoundException VirtualMachineError LinkageError AssertionError StackOverflowError ExceptionInitializerError NoClassDefFoundError NumberFormatException 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 Throwable类有两个子类,一个是Error类,另一个 是Exception类,这两个子类又分别有若干个子类 。 Error类描述的是系统内部错误,这样的错误很少 出现。如果发生了这类错误,则除了通知用户及终 止程序外,几乎什么也不能做,程序中一般不对这 类错误处理。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 Exception类及其子类一般又可分为两种类型: 运行时异常:RuntimeException类及其子类代表 的异常称为运行时异常。有时又称为未检查的异常 (unchecked exception),即编译器不检查。上面的 第一个例子中的异常就是运行时异常 ArithmeticException。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 非运行时异常:除RuntimeException类及其子类 以外的类称为非运行时异常,有时也称为检查的异 常(checked exception)。对这类异常,程序必须捕 获或声明抛出,否则编译不能通过。如果试图使用 Java命令运行一个不存在的类,则会产生 ClassNotFoundException异常,如调用了一个不 存在的方法,则会产生NoSuchMethodException 异常。上面的第二个例子的异常就是非运行时异常 IOException。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.2 异常处理机制 7.2.1 运行时异常 7.2.2 异常处理 7.2.3 声明方法抛出异常 7.2.4 用throw语句抛出异常 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.2.1 运行时异常 运行时异常是系统在运行时检测到的,可能发生 在程序的任何部位且数量较大,因此Java编译器允 许对运行时异常(包括Error类的子类) 不作处理,但 发生异常运行时系统会把异常对象交给默认的异常 处理程序,在标准输出上显示异常的内容及发生异 常的位置。下面介绍几种常见的运行时异常。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 ArithmeticException算术异常是在做整数的除法或 整数求余运算时可能产生的异常,它是在除数为零 时产生的异常。 注意:浮点数运算不会产生该类异常。 如,1.0/0.0的结果为Infinity。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 NullPointerException空指针异常,即当某个对象 的引用为null时调用该对象的方法或使用对象时就 会产生该异常,如: String str=null ; str.length(); /该语句发生异常 int a=null ; a0=0; /该语句发生异常 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 ClassCastException 类对象造型异常,Java支 持运行时多态,即可以将一个对象从一个类型转 换成另一个类型,若不符合造型的规定,则产生 类造型异常。 Object o=new Object(); String s=(String)o; /该语句发生异常 Sytem.out.println(s.length(); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 ArrayIndexOutOfBoundsException数组下标越界 异常,当引用数组元素的下标超出范围时产生的异 常。 int a=new int5; a5=10; /该语句发生异常 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 NumberFormatException 数字格式错误异常。在将 字符串转换为数值时,如果字符串不能正确转换成 数值则产生该异常,例如: double d = Double.parseDouble(“5m7.8“); 注意:尽管对运行时异常可以不处理,但程序运行 时产生这类异常,程序也不能正常结束。因此为了 保证程序正常运行,要么避免产生运行时异常,要 么对运行时异常进行处理。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.2.2 异常处理 上述这些异常是在运行时产生的,当发生异常时程 序都要终止运行,这不是我们希望的,因此必须采 取某种措施对这些异常进行处理,使程序能够正常 结束,这就需要在程序中捕获异常并编写处理异常 的代码。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 异常都是在方法中产生的。在一个方法的运行过 程中如果产生了异常,在这个方法中就生成一个 代表该异常类的对象,并把它交给运行时系统, 运行时系统寻找相应的代码来处理这一异常。我 们把生成异常对象并把它交给运行时系统的过程 称为抛出异常(throw exception)。运行时系统在 方法的调用栈中查找,从产生异常的方法开始进 行回溯,直到找到包含相应异常处理的方法为止 ,这一过程成为捕获异常(catch exception)。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 处理异常的方法一般有两种: 一是使用try-catch-finally结构捕获和处理异常 另一种是声明方法抛出异常,由调用该方法的方 法处理异常。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 在Java语言中捕获并处理异常最常用的方法是用try-catch- finally结构,该结构的一般格式为: try /Java statements catch (ExceptionType1 exceptionObject) /Exception handling catch (ExceptionType1 exceptionObject) /Exception handling finally /Final handling 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 说明: (1)上述结构是将程序中可能产生异常的代码段用try 块括起来,该块内可能抛出一个或多个异常; (2) catch块用来捕获异常,括号中指明捕获的异常类 型及异常对象名,类似于方法的参数,它指明了 catch语句所处理的异常。大括号中是处理异常的 代码。catch语句可以有多个,分别用来处理不同 类型的异常。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 注意:若有多个catch块,排列顺序必须按照异常 类型从特殊到一般的顺序,即子类异常放在前面, 父类异常放在后面,否则产生编译错误。 当try块中产生异常,运行时系统从上到下依次检 测异常对象与哪个catch块声明的异常类相匹配, 若找到匹配的或其父类异常,既进入相应catch块 处理异常,catch块执行完毕说明异常得到处理。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 (3) finally块是可选项。有时我们需要程序无论是否发生异常 ,都要执行一段代码,这时就可以通过finally块实现。注意 若有finally块,程序中的代码无论try块中发生不发生异常, 也无论catch语句的异常类型与所抛出的异常类型是否一致 ,finally所指定的代码都有被执行,实际上它提供了一个统 一的出口。即使是使用了return语句,finally块也要被执行 ,除非catch块中调用了System.exit()方法终止程序的运行 。另外需要注意,一个try块必须有一个catch块或finally块 ,catch块或finally块也不能单独使用,必须与try块搭配使 用。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 下面使用try-catch结构编写Test程序。 public class Test public static void main(String args) int a=5; try int b=a/0; catch(Exception e) System.out.println(e.getMessage(); System.out.println(“a=”+a); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 程序运行结果为: / by zero a=5 从上述结果可以看到,程序运行中发生的异常得到 了处理,接下来程序继续运行。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 对6.1.1节的第2个例子由于调用了read()方法,可以使用try- catch结构捕获。 import java.io.*; public class InputChar public static void main(String args) System.out.print(“Input a char:“); try char c=(char)System.in.read(); System.out.println(“c=“+c); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 catch(IOException e) System.out.println(“Caught :”+e); e.printStackTrace(); 该程序中使用了异常对象e的getMessage()方法输 出有关的信息,该方法是Throwable类中定义的方 法,该类中定义的常用方法有: 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 public String getMessage() 返回异常对象的细节描述。 public String getLocalizedMessage() 返回异常对象的针对 特定语言的细节描述。 public void printStackTrace() 在标准错误输出流上输出异常 调用栈的轨迹。 public void printStackTrace(PrintStream s) 在指定输出流上 输出异常调用栈的轨迹。 public void printStackTrace(PrintWriter s) 在指定输出流上 输出异常调用栈的轨迹。 public String toString() 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 下面的例子说明了有关异常类方法的使用: public class ExceptionMethods public static void main(String args) try throw new Exception(“Here is my exception.“); catch(Exception e) System.out.println(“Caught Exception.“); System.err.println(“e.getMessage():“+e.getMessage(); System.err.println(“e.getLocalizedMessage():“+ e.getLocalizedMessage(); System.out.println(“toString(): “+e); System.out.println(“e.printStackTrace(): “); e.printStackTrace(System.err); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.2.2 异常处理 程序运行结果为: Caught Exception. e.getMessage():Here is my exception. e.getLocalizedMessage():Here is my exception. toString(): java.lang.Exception: Here is my exception. e.printStackTrace(): java.lang.Exception: Here is my exception. at ExceptionMethods.main(ExceptionMethods.java:4) 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 注意:catch块中的异常可以是超类异常,另外 catch块中可以不写任何语句,只要有一对大括号 ,系统就认为异常被处理了。该程序编译就不会出 现错误,编译后程序正常运行。但注意catch块内 的语句只有在真的产生异常时才被执行。 示例程序: 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.2.3 声明方法抛出异常 所有的异常都产生在方法(包括构造方法)内部的语句。有 时方法中产生的异常不需要在该方法中处理,可能需要由 该方法的调用方法处理,这时可以在声明方法时用throws 子句声明抛出异常,将异常向上传递,由调用该方法的方 法处理。声明方法抛出异常的格式如下: returnType methodName(paramlist) thows ExceptionList /body of method 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 按上述方式声明的方法,就可以对方法中产生的异 常不作处理,若方法内抛出了异常,则调用该方法 的方法必须捕获这些异常或者再声明抛出。 上面的例子是在proc()方法中处理异常,现在在该 方法中不处理异常,而由调用该方法的main()方法 处理,程序修改如下: 示例程序: 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 在前面我们讲到子类可以覆盖超类的方法,但若超 的方法使用throws声明抛出了异常,子类方法也可 以使用throws声明异常。但是要注意,子类方法不 能抛出多于超类方法抛出的异常,即不能抛出比超 类更一般的异常。 例如: 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 import java.io.*; class A public void methodA() throws IOException / class B1 extends A public void methodA() throws FileNotFoundException / 合法 / class B2 extends A public void methodA() throws Exception / 不合法 / 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 上述代码中B1类的methodA()方法是对A类methodA()方法 的覆盖,它抛出了FileNotFoundException异常,因为该异 常是 IOException 异常类的子类,这是允许的。而在B2类 的 methodA()中抛出了Exception异常,该异常是 IOException 异常类的父类,这是不允许的,编译不能通过 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.2.4 用throw语句抛出异常 到目前为止,我们处理的异常是由程序产生的,并 由程序自动抛出,然而也可以创建一个异常对象, 然后用throw语句抛出,或者将捕获到的用throw语 句再次抛出,该语句的格式如下: throw throwableInstance; throwableInstance可以是用户创建的异常对象,也 可以是程序捕获到的异常对象,该实例必须是 Throwable类或其子类的实例, 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 请看下面例子。 /ThrowDemo.java public class ThrowDemo static void method() try throw new NullPointerException(“demo”); catch(NullPointerException e) System.out.println(“caught inside method”); throw e; /将捕获到的异常再次抛出 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 public static void main(String args) try method(); catch(NullPointerException e) System.out.println(“recaught:”+e); 程序的输出结果为: caught inside method recaugth:java.lang.NullPointerException:demo 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 上述程序在method()方法中try块中用new创建一个异常对 象并将其抛出,随后在catch结构中捕获到该异常,然后又 再次将该异常抛给main()方法,在main()方法的catch块中 捕获并处理了该异常。 请注意,该程序在main()方法中可以不捕获该异常,程序编 译也能够通过,因为NullPointerException是运行时异常。 但对非运行时异常就必须捕获,如将method()方法中抛出 异常的语句该为throw new IOException(“demo”); 则main() 方法中必须捕获该异常。 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.3 创建自己的异常类 尽管Java已经预定义了许多异常类,但有时我们还需要定义自己的异 常,这时只需要继承Exception类或其子类就可以了,例如: class MyException extends Exception private int exceptnumber; public MyException(int a) exceptnumber=a; public String toString() return “MyException“+exceptnumber+“; 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 下面的程序中使用了自定义的类MyException: public class ExceptionExample static void makeexcept(int a) throws MyException System.out.println(“called makeexcept(“+a+“)“); if(a=0) throw new MyException(a); System.out.println(“exit without exception“); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 public static void main(String args) try makeexcept(5); makeexcept(0); catch(MyException e) System.out.println(“caught:“+e); 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 该程序的输出为: called makeexcept(5) exit without exception called makeexcept(0) caught:MyException0 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 7.4 断言机制 7.4.1 使用断言 7.4.2 启动和关闭断言功能 7.4.3 使用异常处理或断言 第7章 异常处理与断言 渤海大学信息科学与工程学院 2007.9 断言是Java 1.4版新增的一个特性,并在该版本中增加了一 个关键字assert。可以把断言功能看成是异常处理的高级形 式。 所谓断言(assertion)是一个Java语句,布尔表达式,程序员 认为在程序执行时该表达式的值应该为true。系统通过计算 该布尔表达式执行断言,若该表达式为false系统会报告一 个错误。通过验证断言是true,能够使程序员确信程序正确 为了提高性能,可能要关闭断言检查。通常在程序开发和 调试阶段开启断言功能,在部署时关闭。 缺省情况下,

温馨提示

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

评论

0/150

提交评论