Java程序开发教学课件:08-异常_第1页
Java程序开发教学课件:08-异常_第2页
Java程序开发教学课件:08-异常_第3页
Java程序开发教学课件:08-异常_第4页
Java程序开发教学课件:08-异常_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

Java程序设计

——异常处理重庆大学计算机学院

Java的异常处理1什么是异常2异常处理机制3异常的处理4创建用户异常类1什么是异常异常(Exception)也叫例外。在Java编程语言中,异常就是程序在运行过程中由于硬件设备问题、软件设计错误、缺陷等导致的程序错误。在软件开发过程中,很多情况都将导致异常的产生,例如:(1)想打开的文件不存在;(2)网络连接中断;(3)操作数超出预定范围;(4)正在装载的类文件丢失;(5)访问的数据库打不开;1什么是异常可见,在程序中产生异常的现象是非常普遍的。在Java编程语言中,对异常的处理有非常完备的机制。异常本身作为一个对象,产生异常就是产生一个异常对象。这个对象可能由应用程序本身产生,也可能由Java虚拟机产生,这取决于产生异常的类型。该异常对象中包括了异常事件的类型以及发生异常时应用程序目前的状态和调用过程。请看下面产生异常的例子。1什么是异常【例1】文件操作将产生异常//Exception1.javaimportjava.io.*;classException1{publicstaticvoidmain(Stringargs[]){FileInputStreamfis=newFileInputStream("text.txt");intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}1什么是异常当编译这个程序时,屏幕上会输出下面的信息:D:\user\chap08>javacException1.javaException1.java:5:unreportedexceptionjava.io.FileNotFoundException;mustbecaughtordeclaredtobethrownFileInputStreamfis=newFileInputStream("text.txt");

^Exception1.java:7:unreportedexceptionjava.io.IOException;mustbecaughtordeclaredtobethrownwhile((b=fis.read())!=-1){

^Exception1.java:10:unreportedexceptionjava.io.IOException;mustbecaughtordeclaredtobethrownfis.close();

^3errors1什么是异常【例2】数组下标超界的例子//Exception2.javapublicclassException2{publicstaticvoidmain(Stringargs[]){Stringlangs[]={"Java","VisaulBasic","C++"};inti=0;while(i<4){System.out.println(langs[i]);i++;}}}1什么是异常程序的编译和运行结果如下:D:\user\chap08>javacException2.javaD:\user\chap08>javaException2JavaVisaulBasicC++Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3atException2.main(Exception2.java:8)这个的例子编译可以通过,但运行时出现异常信息被抛出。在其循环被执行四次之后,数组下标溢出,程序终止,并带有错误信息,就象前面所示的程序那样。1什么是异常【例3】被0除的例子//Exception3.javaclassException3{publicstaticvoidmain(Stringargs[]){inta=0;System.out.println(5/a);}}我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:D:\user\chap08>javacException3.javaD:\user\chap08>javaException3Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatException3.main(Exception3.java:5)因为除数不能为0,所以在程序运行的时候出现了除以0溢出的异常事件。1什么是异常

在上面的三个例子中,我们都遇到了异常。屏幕上所显示的信息java.io.IOException、java.io.FileNotFoundException、java.lang.ArrayIndexOutOfBoundsException

以及java.lang.ArithmeticException

1什么是异常

分别指明了异常的类型以及异常所在的包。同时我们也可以看到,对于某些异常,在程序中必须对它进行处理,否则编译程序会指出错误(如例1)。但对另一些异常,在程序中可以不做处理,而直接由运行时系统来处理(如例3)。在下节中,我们将详细了解这两类异常,以及在程序中如何处理这两类异常。

Java异常处理1什么是异常2异常处理机制3异常的处理4创建用户异常类2异常处理机制2.1Java的异常处理机制2.2异常类的类层次2.3Throwable类的常用方法2.1Java的异常处理机制

在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。这个对象可能是由正在运行的方法生成,也可能由Java虚拟机生成,其中包含一些信息指明异常事件的类型以及当异常发生时程序的运行状态等。Java语言提供两种处理异常的机制:

(1)捕获异常

在Java程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。这是一种积极的异常处理机制。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。

2.1Java的异常处理机制(2)声明抛弃异常当Java程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃(throws)异常。2.2异常类的类层次

前面已经提到,Java是采用面向对象的方法来处理错误的,一个异常事件是由一个异常对象来代表的。这些异常对象都对应于类java.lang.Throwable及其子类。下面我们就来看一下异常类的层次。

在java类库的每个包中都定义了自己的异常类,所有这些类都直接或间接地继承于类Throwable。下图列举了一些异常类并指明了它们的继承关系。

2.2异常类的类层次

从上图可以看出,Java中的异常事件分为两大类。一类继承于类Error,它的继承关系如下:java.lang.Objectjava.lang.Throwablejava.lang.Error

常见的错误类有AnnotationFormatError,AssertionError,AWTError,LinkageError,CoderMalfunctionError,FactoryConfigurationError,ThreadDeath,VirtualMachineError,TransformerFactoryConfigurationError等,包括动态链接失败、线程死锁、图形界面错误、虚拟机错误等,通常Java程序不应该捕获这类异常,也不会抛弃这种异常。2.2异常类的类层次另外一类异常则继承于类Exception,这是Java程序中所大量处理的异常。它的继承关系如下:java.lang.Objectjava.lang.Throwablejava.lang.Exception常见的异常类有:AclNotFoundException,PrintException,GeneralSecurityException,InterruptedException,InvalidPreferencesFormatException,ParseException,RuntimeException,SAXException,SQLException,TimeoutException,TransformerException,UnsupportedCallbackException,UnsupportedLookAndFeelException,URISyntaxException,UserException,XAException,XMLParseException,XPathException

其中包括了运行时异常和非运行时异常。

异常体系结构所有异常类型都是内置类Throwable的子类用于Java运行时系统来显示与运行时系统本身有关的错误用于用户程序可能捕获的异常,也是用来创建用户异常类型子类的类。Error类对象由Java虚拟机生成并抛出;Exception类对象由应用程序处理或抛出。2.2异常类的类层次

2.2异常类的类层次

常见的运行时异常如下:(1)类型转换异常ClassCastExceptionStringstrName=newstring(“123”);intnNumber=(int)strName;(2)数组超界异常ArrayIndexOutBoundsExceptionint[]b=newint[10];b[10]=1000;(3)指定数组维数为负值异常NegativeArraySizeExceptionb[-1]=1001;(4)算术异常ArithmeticExceptionintb=0;a=500/b;(5)Java系统内部异常InternalExceptionJVM抛出的异常。(6)类型不符合异常IncompatibleTypeExceptionintn=12345;Strings=(String)n;(7)内存溢出异常OutOfMemeoryException(8)没有找到类定义异常NoClassDefFoundExceptionaClassaa=newaClas();//但aClass类未定义。(9)空指针异常NullPointerExceptionintb[];b[0]=99;//没有实例化,就访问,将产生空指针。2.2异常类的类层次

常见的非运行时异常如下:(1)ClassNotFoundException:找不到类或接口所产生的异常(2)CloneNotSupportedException:使用对象的clone方法但无法执行Cloneable所产生的异常。(3)IllegalAccessException:类定义不明确所产生的异常。例如:类不为public,或是包含一个类定义在另一个类库内。(4)IOException:在一般情况下不能完成I/O操作所产生的异常。(5)EOFException:打开文件没有数据可以读取所产生的异常(6)FileNotFoundException:在文件系统中,找不到文件名称或路径所产生(7)InterruptedIOException:目前线程等待执行,另一线程中断目前线程I/O运行所产生的异常

在Sun公司提供的各种API包中,如java.io,,java.awt等,都提供不同情况下可能产生的异常。由于异常的种类非常多,需要读者实际运用中逐渐掌握。

2.3Throwable类的常用方法

java.lng.Throwable类是所有Error类和Exception类的父类,常用的方法有fillInStackTrace()、getLocalizedMessage()、getMessage()、printStackTrace()、printStackTrace(PrintStream)、printStackTrace(PrintWriter)、toString()。(1)publicnativeThrowablefillInStackTrace()填写执行堆栈跟踪信息。

该方法在应用程序重新抛出错误或异常时有用。例如:

try{a=b/c;}catch(ArithmeticExceptione){a=Integer.MAX_VALUE;throwe.fillInStackTrace();}(2)publicStringgetLocalizedMessage()生成该Throwable的本地化描述。

子类可能会覆盖该方法以便产生一个特定于本地的消息。

对于未覆盖该方法的子类,缺省地返回调用getMessage()的结果。

2.3Throwable类的常用方法

(3)publicStringgetMessage()返回该throwable对象的详细信息。如果该对象没有详细信息则返回null。

(4)publicvoidprintStackTrace()把该Throwable和它的跟踪情况打印到标准错误流。(5)publicvoidprintStackTrace(PrintStreams)把该Throwable和它的跟踪情况打印到指定打印流。

(6)publicvoidprintStackTrace(PrintWriters)把该Throwable和它的跟踪情况打印到指定打印流。(7)publicStringtoString()返回该throwable对象的简短字符串描述。

Java异常处理1什么是异常2异常处理机制3异常的处理4创建用户异常类3异常的处理3.1捕获异常try-catch-finally3.2声明抛弃异常3.3抛出异常3.1捕获异常try-catch-finally

一个方法中如果对某种类型的异常对象提供了相应的处理代码,则这个方法可捕获该种异常。捕获异常是通过try-catch-finally语句实现的。其语法为:try{

......

}catch(ExceptionName1e){

......

}catch(ExceptionName2e){

......

}

......

}finally{

......

}

1、try捕获异常的第一步是用try{…}选定捕获异常的范围,由try所限定的代码块中的语句在执行过程中可能会生成异常对象并抛弃。3.1捕获异常try-catch-finally

2、catch原理每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数来指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。catch块中的代码用来对异常对象进行处理,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage()是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。例如:

3.1捕获异常try-catch-finallytry{

......

}catch(FileNotFoundExceptione){

System.out.println(e);

System.out.println(“message:”+e.getMessage());

e.printStackTrace(System.out);

}catch(IOExceptione){

System.out.println(e);

}

3.1捕获异常try-catch-finally

3、catch语句的顺序

捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。例如上面的程序如果安排成如下的形式:

try{

......

}catch(IOExceptione){

System.out.println(e);

System.out.println("message:"+e.getMessage());

e.printStackTrace(System.out);

}catch(FileNotFoundExceptione){

System.out.println(e);

}3.1捕获异常try-catch-finally

由于第一个catch语句首先得到匹配,第二个catch语句将不会被执行。编译时将出现“catchnotreached”的错误。

4、finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。一般是用来关闭文件或释放其他的系统资源。虽然finally作为try-catch-finally结构的一部分,但在程序是可选的,也就是说可以没有finally语句。如果存在finally语句,不论try块中是否发生了异常,是否执行过catch语句,都要执行finally语句。另外,try-catch-finally可以嵌套。3.2声明抛弃异常

如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,该方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。

声明抛弃异常是在一个方法声明中的throws子句中指明的。例如:

publicintread()throwsIOException{……}throws子句中同时可以指明多个异常,之间由逗号隔开。例如:

publicstaticvoidmain(Stringargs[])throws

IOException,IndexOutOfBoundsException{……}

最后,我们再次强调,对于非运行时例外,如前例中的IOException等,程序中必须要作出处理,或者捕获,或者声明抛弃。而对于运行时例外,如前例中的ArithmeticException,IndexOutOfBoundsException,则可以不做处理。3.2声明抛弃异常

【例4】抛弃异常的例子(对例1进行改进)//Exception4.javaimportjava.io.*;publicclassException4{publicstaticvoidmain(Stringargs[])throwsFileNotFoundException,IOException{FileInputStreamfis=newFileInputStream(“text.txt”);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}3.2声明抛弃异常

【例5】捕获异常的例子(对例1进行改进)importjava.io.*;publicclassException5{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream(“text.txt”);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}catch(FileNotFoundExceptione){

System.out.println(e);

System.out.println("message:"+e.getMessage());

e.printStackTrace(System.out);

}catch(IOExceptione){

System.out.println(e);

}}}3.3抛出异常

抛出异常就是产生异常对象的过程,首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出异常对象是通过throw语句实现的。例如:IOExceptione=newIOException();

throwe;可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:thrownewString("throwanything");

自定义异常类必须是Throwable的直接或间接子类。

3.3抛出异常【例6】显示抛出异常详细情况的例子//Exception6.javapublic

class

Exception6

{

public

static

void

main(String[]

args)

{

try

{

throw

new

Exception("My

Exception");

}

catch

(Exception

e)

{

System.err.println("Caught

Exception");

System.err.println("getMessage():"

+

e.getMessage());

System.err.println("getLocalizedMessage():"

+

e.getLocalizedMessage());

System.err.println("toString():"

+

e);

System.err.println("printStackTrace():");

e.printStackTrace();

}

}

}

3.3抛出异常程序运行结果如下:d:\user\chap08>javaException6CaughtExceptiongetMessage():MyExceptiongetLocalizedMessage():MyExceptiontoString():java.lang.Exception:MyExceptionprintStackTrace():java.lang.Exception:MyException atException6.main(Exception6.java:5)

Java异常处理1什么是异常2异常处理机制3异常的处理4创建用户异常类4创建用户异常类

如果Java提供的系统异常类型不能满足程序设计的需求,我们可以设计自己的异常类型。从Java异常类的结构层次可以看出,Java异常的公共父类为Throwable。在程序运行中可能出现两种问题:一种是由硬件系统或JVM导致的故障,Java定义该故障为Error。这类问题用户程序不能够处理的。另外一种问题是程序运行错误,Java定义为Exception。这种情况下,可以通过程序设计的调整来实现异常处理。因此,用户定义的异常类型必须是Throwable的直接或间接子类。Java推荐用户的异常类型以Exception为直接父类。创建用户异常的方法如下:

4创建用户异常类

classUserExceptionextendsException{UserException(){super();

……//其它语句}}我们在使用异常时,有以下几点建议需要注意:(1)对于运行时例外,如果不能预测它何时发生,程序可以不做处理,而是让Java虚机去处理它。(2)如果程序可以预知运行时例外可能发生的地点和时间,则应该在程序中进行处理,而不应简单地把它交给运行时系统。

(3)在自定义异常类时,如果它所对应的异常事件通常总是在运行时产生的,而且不容易预测它将在何时、何处发生,则可以把它定义为运行时例外,否则应定义为非运行时例外。4创建用户异常类

。【例7】用户定义的异常类的使用//Exception8.javaclassMyotherExceptionextendsException{//用户定义的异常publicMyotherException(){}publicMyotherException(Stringmsg){super(msg);}}4创建用户异常类publicclassException8{publicstaticvoidf()throwsMyotherException{System.out.println("ThrowingMyotherExceptionfromf()");thrownewMyotherException();}publicstaticvoidg()throwsMyotherException{System.out.println("ThrowingMyotherExceptionfromg()");thrownewMyotherException("Originateding()");}

4创建用户异常类publicstaticvoidmain(String[]args){try{f();}catch(MyotherExceptione){e.printStackTrace();}try{g();}catch(MyotherExceptione){e.printStackTrace();}}}4创建用户异常类程序的运行结果如下:ThrowingMyotherExceptionfromf()ThrowingMyotherExcepti

温馨提示

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

评论

0/150

提交评论