《Java程序设计基础》第7章:例外处理.ppt
《《Java程序设计基础》第7章:例外处理.ppt》由会员分享,可在线阅读,更多相关《《Java程序设计基础》第7章:例外处理.ppt(65页珍藏版)》请在三一办公上搜索。
1、第7章 例外处理,学习重点:例外机制Java定义的例外类如何定义自己的例外类,第7章 例外处理,7.1 例外的概念 程序中的错误 例外的概念 例外控制机制 7.2 Java定义的例外类 Java中的例外类 例外类使用中的两个问题 例外在继承关系中的特殊性 例外的重新抛出 7.3 关于finally finally的使用方法 finally用在哪里 finally的缺陷 7.4 定义自己的例外 7.5 练习题,7.1 例外的概念,例外是一种对象,它是在某种运行错误时被创建的,例外控制机制是Java用来进行例外控制的一种有效手段。,7.1.1 程序中的错误,编译错误 程序的编制存在语法错误,编译器
2、能检查出这种错误,此时程序不能继续运行。我们在以前的程序编制和运行中可能已经遇到过编译错误的情况,可以根据系统的提示加以修改运行错误 程序在执行过程中产生的错误,它很有可能产生不可意料的结果,有时可能对系统有严重的危害,如计算机的瘫痪。,常见的运行错误表现为两个方面:一是对操作系统产生影响,出现死机、死循环等现象 二是程序的运行结果和编程者的意图不符 排除运行错误的手段:使用开发环境提供的单步运行机制和设置断点来暂停程序运行,一步步发现错误,或打印一部分的中间结果用于分析,找到错误。,7.1.2 例外的概念,例外(Exception),在其他材料上可能被译为“异常”,指程序在执行过程中出现程序
3、本身没有预料到的情况,从而导致程序错误结束。例外机制就是用来在发生运行异常时,告诉程序如何控制自身的运行,以防止错误的进一步恶化。,例外是一个对象,它在程序运行异常的时候被创建出来,并被在发生错误的位置抛出(throw),由一定的接收机制来接收并处理,这就是例外处理的一个简单过程例外的产生一定有条件的,例外条件与普通问题的区别:在普通问题的情况下,在当地可能有足够的信息,可在某种程度上解决碰到的问题。在例外条件的情况下,却无法继续下去,因为当地没有提供解决问题所需的足够多的信息。此时,我们能做的惟一事情就是跳出当地环境,将那个问题委托给一个更高级的负责人。这便是出现例外时的情况。,产生一个例外
4、时,会发生几件事情,首先,按照与创建Java对象一样的方法创建例外对象:使用new来创 建。随后,停止当前执行路径(记住不可沿这条路径继续下去),然后从 当前的环境中释放出例外对象的地址。此时,例外控制机制 会接管一切,并把程序运行转移到另一个地方,这个地方可 称为例外控制器,它的职责是解决这个运行问题,要么使程 序简单地继续,要么结束程序并报错。,产生例外的一个简单示例,假设有一个名为t的对象,它只是被定义,而还没有在内存中创建,这个对象名并未指向任何实际的内存地址 if(t=null)throw new NullPointerException();/“抛”出了一NullPointerEx
5、ception类的例外抛出这个例外后,“例外控制器”就会处理这个问题。,7.1.3 例外控制机制,1.例外处理的语法结构 对于Java的例外控制机制,Java把可能产生例外的代码段形成一个区域,可称为“警戒区”,然后紧接例外控制器。警戒区由try引导,例外控制器由catch引导,一个警戒区可以接多个catch从句,以对应多种例外。结构如下:try可能产生例外的代码段;catch(例外类名1 对象名1)处理语句组1;catch(例外类名2 对象名2)处理语句组2;try块一般位于一个方法的内部,它用来包含有可能抛出例外的程序段,try块的格式如下:,try 可能产生例外的代码段try块中的代码段
6、可以是几个简单语句,也可以是方法的调用,也可以是很复杂的结构,如以下的一种情况都可以:trythrow new ExceptionName();tryfunctionA();/这个方法的调用可能产生例外tryint i=0;for(i=0;i100;i+)catch块是专门用来捕获例外的地方,在try块内部,不同的方法调用可能生成相同的例外,但只需要一个控制器。另外,在通常情况下,遇到例外时,程序会自行中断,而转到catch程序去继续执行,出现例外的语句后面的逻辑都将不再被执行,例7.1 例外处理 这个程序的处理逻辑是,在初始化时,创建一个类似数组的对象vector(关于vector的使用在后
7、面章节介绍),像其中存储09十个数字,然后将这些数字取出来写入一个文件OutFile.txt中,如果这个文件不存在于当前目录中,就创建一个新文件。在程序中粗体字的部分都可能出现错误,因此,需要进行例外处理程序逻辑已经预计到的例外有两方面,一是数组下标出界,即ArrayIndexOutOfBoundsException二是IO错误,即IOException,并在两处catch语句中都做了相应处理,ListOfNumbers.java的源程序如下:import java.io.*;import;public class ListOfNumbers public static void main(S
8、tring args)ListOfNumbers list=new ListOfNumbers();list.writeList();private Vector victor;private static final int size=10;public ListOfNumbers()victor=new Vector(size);for(int i=0;i size;i+)victor.addElement(new Integer(i);public void writeList()PrintStream out=null;try System.out.println(Entering t
9、ry statement);/打开向文件写入的输出流,在这句话执行过程中可能会出现错误 out=new PrintStream(new FileOutputStream(OutFile.txt);/向输出流中写内容,也可能出现错误 for(int i=0;i size;i+)out.println(Value at:+i+=+victor.elementAt(i);catch(ArrayIndexOutOfBoundsException e)System.err.println(Caught ArrayIndexOutOfBoundsException:+e.getMessage();catc
10、h(IOException e)System.err.println(Caught IOException:+e.getMessage();,假如对程序做一点修改,将“for(int i=0;i size;i+)”改为“for(int i=0;i=size;i+)”,就会得到如图所示的结果,另外一种修改,将上次执行时已经产生的OutFile.txt文件的属性修改为只读,然后再执行程序,就会得到的结果如图所示,2.Java中对例外的规定,在Java中,每个方法必须对它可能抛出的例外进行预先声明,这就是方法头中throws后面的内容,也就是说在定义方法时,必须声明这个方法可能会抛出哪一种或几种例外
11、。两个方法头的定义:/它可能抛出tooBig,tooSmall,divZero3个例外类的例外void f()throws tooBig,tooSmall,divZero/它不会抛出任何例外void f()/.,Java在编译期间就进行例外控制情况的检查,如果某个方法可能抛出例外,而程序没有使用throws指明这个例外,或者没有使用try/catch语句对例外进行处理,编译器都会给出提示,并告诉我们必须对这个例外进行控制,例如,我们在上面讲到的ListOfNumber.java中如果不进行例外处理,即去掉try/catch语句,编译时会得到如下结果:ListOfNumbers.java:24:
12、unreported exception;mustbe caught or declared to be thrown out=new PrintStream(new FileOutputStream(OutFile.txt);1 error,Java允许声明抛出一个并没有发生的例外,编译器能理解我们的要求,并强迫使用这个方法的用户当做真的产生了那个例外处理,好处:在应用中,可将其作为一个“占位符”使用,这样一来,以后如果修改这个方法,让它产生实际的例外,而不需修改调用这个方法的现有代码。定义空例外的例子如下:public void f()throws Exception/Exception是
13、一个已经定义好的例外类这个方法f()是一个空方法,无论如何抛不出任何例外,但编译器允许我们定义它可能会抛出例外类Exception的例外。当其他方法调用f()时必须把它置入try块中。,7.2 Java定义的例外类,我们已经讲过,一个例外类在使用它时必须先定义,可以想象,如果这些例外类都由我们自己定义是很麻烦的事,幸好Java已经定义好了许多常用的类,我们就来介绍一下Java中已经定义的例外类。,7.2.1 Java中的例外类,Throwable及其子类类定义 Throwable是Object类的子类,并且实现了接口 Serializable 构造函数Throwable类有public Thr
14、owable()和public Throwable(Stringmessage)两个构造 函数。方法 getMessage()toString()printStackTrace()fillInStackTrace(),下面我们通过一个例子来看Throwable的这些方法如何使用。例7.2 例外方法的使用 ThrowableMethods.java的源程序如下:,public class ThrowableMethods public static void main(String args)try/try块中只有一抛出例外的语句 throw new Throwable(Heres my Thr
15、owable);catch(Throwable e)System.out.println(Caught Throwable);System.out.println(e.getMessage():+e.getMessage();System.out.println(e.toString():+e.toString();System.out.println(e.printStackTrace():);e.printStackTrace();,该程序输出结果,该程序输出如下:,Caught Throwablee.getMessage():Heres my Throwable:Heres my Thr
16、owablee.printStackTrace():Heres my Throwable at ExceptionMethods.main(ExceptionMethods.java:4)如果我们将“throw new Throwable(Heres my Throwable)”;修改为“/throw new Throwable();”,那么得到的结果就是这样的:Caught Throwablee.getMessage():nulle.toString():java.lang.Throwablee.printStackTrace():java.lang.Throwable at Excepti
17、onMethods.main(ExceptionMethods.java:4),2.例外类之间的继承关系,Throwable对象有两个子类:Error和Exception。Java定义的例外类都是Exception的子类,这些子类被放置于不同的包中,Throwable类大致的继承结构如图所示,Exception这个类是我们用到的例外类的祖先类,它在java.lang包中,所有的能捕获的类都是从它衍生出来的,我们可创建一个控制器,令其捕获所有类型的例外。具体的做法是捕获基础例外类Exception(Exception是适用于几乎所有编程活动的基础)。例如:catch(Exception e)Sy
18、stem.out.println(caught an exception);这段代码能捕获任何例外,所以在实际使用时最好将其置于控制器列表的末尾,防止跟随在后面的任何特殊例外控制器失效。,7.2.2 例外类使用中的两个问题,例外是一种比较特殊的类,在其使用过程中有很多特殊问题,需要大家注意,这一节我们就几个常见问题和大家做一个讨论。,1例外匹配 例外匹配是指try块中抛出的对象如何找到对应的例外控 制器,例7.3 子类不能和父类例外匹配 MissCatch.java的源程序如下:public class MissCatch public static void main(String args
19、)throws Throwable try throw new Throwable();catch(Exception e)/这个语句不能捕获Throwable类例外 System.out.println(Caught in main()!);这个程序的try块中抛出的是Throwable类例外,而catch括号内定义的例外名e是Exception类的,所以不能形成匹配,从而使Throwable类的例外未被捕获,这种错误在编译过程中是不能被发现的,直到运行时才会被发现,因此运行结果如下,运行结果,Exception in thread main at MissCatch.main(MissCa
20、tch.java:4)如果上例中的Throwable与Exception进行对换,即改为:try throw new Exception();catch(Throwable e)/这个语句不能捕获Throwable类例外 System.out.println(Caught in main()!);结果,或者把Throwable改成Exception,再或者把Exception改成Throwable,输出结果都是:Caught in main()!说明例外控制捕获了例外。,由于抛出一个例外后,例外控制系统会按顺序搜索“最接近”的控制器。一旦找到相符的控制器,就认为例外已得到控制,不再进行更多的搜
21、索工作 例7.4 控制器的排列问题,Human.java的源文件如下:class Annoyance extends Exception class Sneeze extends Annoyance public class Human public static void main(String args)try throw new Sneeze();catch(Exception c)System.out.println(Caught Exception);catch(Sneeze a)System.out.println(Caught Sneeze);catch(Annoyance b)
22、System.out.println(Caught Annoyance);,输出结果,输出结果如下,Human.java:9:exception Sneeze has already been caught catch(Sneeze a)Human.java:11:exception Annoyance has already been caught catch(Annoyance b)2 errors 在这个程序中,我们先定义了Annoyance和Sneeze两个例外类,其中,Annoyance是从Exception继承而来,而Sneeze是从Annoyance继承而来。然后主程序中捕获这些
23、例外,但是由于程序先捕获了Exception类,那么后面两个例外都不可能被捕获,因此,程序在编译时就会出错,2.RuntimeException的特殊情况,if(t=null)throw new NullPointerException();这个例子看起来上面的语句很正常,如果传递的对象名t未指向任何实际地址,就抛出NullPointerException类的例外。但事实上Java中不需要这样做,Java中存在一个特殊的例外类:RuntimeException,这个类里含有一系列子类。这些类的例外是由系统自动抛出、自动捕获,并由系统自行处理。,如果我们的程序中不捕获RuntimeExcepti
24、on类例外,系统又会如何处理呢?请试试下面这个例子:,例7.5 RuntimeException类的例外CaughtBySystem.java的源文件如下:public class CaughtBySystem static void f()throw new RuntimeException(From f();static void g()f();public static void main(String args)g();,输出结果,输出结果如下:,Exception in thread main:From f()at CaughtBySystem.f(CaughtBySystem.ja
25、va:3)at CaughtBySystem.g(CaughtBySystem.java:6)at CaughtBySystem.main(CaughtBySystem.java:9),7.2.3 例外在继承关系中的特殊性,在子类的方法覆盖父类的方法,且父类的方法声明抛出某些例外时,子类方法只能抛出被覆盖的方法所能抛出的例外所属的例外类或它的衍生类。如果父类中方法未定义成抛出例外,那么子类覆盖的方法也不能抛出例外,如果父类方法声明抛出例外,子类方法可以不声明抛出例外。不过,对于构造函数,父类的构造函数声明抛出的例外必须在子类的构造函数中也声明抛出,子类也可以抛出父类中根本不存在的例外,例7.6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java程序设计基础 Java 程序设计 基础 例外 处理
链接地址:https://www.31ppt.com/p-6525840.html