第5讲Java异常处理主要目标:1.了解异常的产生原理2.掌握异常处理语句的基本格式3.掌握throw和throws关键字的作用4.自定义异常5.了解Exception和RuntimeException的区别6.了解断言的作用主要内容5.1异常的基本概念5.2异常处理机制5.3异常的处理5.4创建用户异常类异常------------????•运行时错误•编译时错误异常是导致程序中断运行的一种指令流,如果不对异常进行正确处理,则可能导致程序的中断执行,造成不必要的损失。Java中异常都是以类和对象的形式存在的。5.1异常的基本概念5.1异常的基本概念在Java编程语言中,异常就是程序在运行过程中由于硬件设备问题、软件设计错误、缺陷等导致的程序错误。在软件开发过程中,很多情况都将导致异常的产生,例如:(1)想打开的文件不存在;(2)网络连接中断;(3)操作数超出预定范围;(4)正在装载的类文件丢失;(5)访问的数据库打不开;5.1什么是异常【例5-1】文件操作将产生异常//Exception1.javaimportjava.io.*;classException1{publicstaticvoidmain(Stringargs[]){FileInputStreamfis=newFileInputStream(text.txt);intb;while((b=fis.read())!=-1){System.out.print(b);}fis.close();}}5.1什么是异常当编译这个程序时,屏幕上会输出下面的信息:D:\user\chap08javacException1.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();^3errors5.1什么是异常【例5-2】数组下标超界的例子//Exception2.javapublicclassException2{publicstaticvoidmain(Stringargs[]){Stringlangs[]={Java,VisaulBasic,C++};inti=0;while(i4){System.out.println(langs[i]);i++;}}}5.1什么是异常程序的编译和运行结果如下:D:\user\chap08javacException2.javaD:\user\chap08javaException2JavaVisaulBasicC++Exceptioninthreadmainjava.lang.ArrayIndexOutOfBoundsException:3atException2.main(Exception2.java:8)上面的例子编译可以通过,但运行时出现异常信息被抛出。在其循环被执行四次之后,数组下标溢出,程序终止,并带有错误信息,就象前面所示的程序那样。5.1什么是异常【例5-3】被0除的例子//Exception3.javaclassException3{publicstaticvoidmain(Stringargs[]){inta=0;System.out.println(5/a);}}我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:D:\user\chap08javacException3.javaD:\user\chap08javaException3Exceptioninthreadmainjava.lang.ArithmeticException:/byzeroatException3.main(Exception3.java:5)因为除数不能为0,所以在程序运行的时候出现了除以0溢出的异常事件。5.1什么是异常在上面的三个例子中,我们都遇到了异常。屏幕上所显示的信息java.io.IOException、java.io.FileNotFoundException、java.lang.ArrayIndexOutOfBoundsException以及java.lang.ArithmeticException分别指明了异常的类型以及异常所在的包。同时我们也可以看到,对于某些异常,在程序中必须对它进行处理,否则编译程序会指出错误(如例8-1)。但对另一些异常,在程序中可以不做处理,而直接由运行时系统来处理(如例8-3)。在下节中,我们将详细了解这两类异常,以及在程序中如何处理这两类异常。5.1.1异常类的继承结构在java类库的每个包中都定义了自己的异常类,所有这些类都直接或间接地继承于类Throwable。Java中的异常事件分为两大类。一类继承于类Error,它的继承关系如下:java.lang.Objectjava.lang.Throwablejava.lang.Error常见的错误类(Error)有:AnnotationFormatError,AssertionError,AWTError,LinkageError,CoderMalfunctionError,FactoryConfigurationError,ThreadDeath,VirtualMachineError,TransformerFactoryConfigurationError等,包括动态链接失败、线程死锁、图形界面错误、虚拟机错误等,通常Java程序不应该捕获这类异常,就算发生了这类异常,程序也无法处理的。5.1.1异常类的继承结构另外一类异常则继承于类Exception,这是Java程序中所大量处理的异常。它的继承关系如下:java.lang.Objectjava.lang.Throwablejava.lang.Exception常见的异常类有:AclNotFoundException,ApplicationException,AWTException,BackingStoreException,ClassNotFoundException,CloneNotSupportedException,DataFormatException,DestroyFailedException,ExecutionException,PrintException,GeneralSecurityException,InterruptedException,InvalidPreferencesFormatException,RuntimeException,SAXException,SQLException,TimeoutException,TransformerException,UnsupportedCallbackException,UnsupportedLookAndFeelException,URISyntaxException,UserException,XAException,XMLParseException,XPathException等其中包括了运行时异常和非运行时异常。5.1.1异常类的继承结构5.1.1异常类的继承结构常见的运行时异常如下:(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;//没有实例化,就访问,将产生空指针。5.1.1异常类的继承结构常见的非运行时异常如下:(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.net,java.awt等,都提供不同情况下可能产生的异常。由于异常的种类非常多,需要读者实际运用中逐渐掌握。5.1.1异常类的继承结构5.1.2Throwable类的常用方法java.lng.Throwable类是所有Error类和Exception类的父类,常用的方法有fillInStackTrace()、getLocalizedMessage()、getMessage()、printStackTrace()、printStackTrace(PrintStream)、printStackTrace(PrintWriter)、toString()。(1)publicnativeThrowablefillInStackTrace()填写执行堆栈跟踪信息。该方法在应用程序重新抛出错误或异常时有用。例如:try{a=b/c;}catch(ArithmeticThrowablee){a=Number.MAX_VALUE;throwe.fillInStackTrace();}(2)publicStringgetLocalizedMessage()生成该Throwable的本地化描述。子类可能会覆盖该方法以便产生一个特定于本地的消息。对于未覆盖该方法的子类,缺省地返回调用getMessage()的结果。5.1.2Throwable类的常用方法(3)publicStringgetMessage()返回该throwable对象的详细信息。如果该对象没有详细信息则返回null。(4)publicvoidprintStackTrace()把该Throwable和它的跟踪情况打印到标准错误流。(5)publicvoidprintStackTrace(PrintStreams)把该Throwable和它的跟踪情况打印到指定打印流。(6)publicvoidprintStackTrace(PrintWriters)把该Throwable和它的跟踪情况打印