《 Java 程序设计之网络编程 》

40
Java Java 程程程程程程程程程程程程程程程程程程程程程程程程程程程 程程程程程程程程程 程程程程程程程程[email protected] [email protected] 教教教教

description

《 Java 程序设计之网络编程 》. 教学课件. 重庆大学计算机学院 电子邮件: [email protected]. 第 8 章 Java 异常处理. 主要内容. 8.1 什么是异常 8.2 异常处理机制 8.3 异常的处理 8.4 创建用户异常类. 8.1 什么是异常. 异常 (Exception) 也叫例外。在 Java 编程语言中,异常就是程序在运行过程中由于硬件设备问题、软件设计错误、缺陷等导致的程序错误。在软件开发过程中,很多情况都将导致异常的产生,例如: (1) 想打开的文件不存在; (2) 网络连接中断; (3) 操作数超出预定范围; - PowerPoint PPT Presentation

Transcript of 《 Java 程序设计之网络编程 》

Page 1: 《 Java 程序设计之网络编程 》

《《 JavaJava 程序设计之网络编程序设计之网络编程》程》

重庆大学计算机学院重庆大学计算机学院电子邮件:电子邮件: [email protected]@126.com

教学课件

Page 2: 《 Java 程序设计之网络编程 》

第第 88 章 章 JavaJava 异常处理异常处理

Page 3: 《 Java 程序设计之网络编程 》

主要内容主要内容8.1 8.1 什么是异常什么是异常8.28.2 异常处理机制异常处理机制8.38.3 异常的处理异常的处理8.4 8.4 创建用户异常类创建用户异常类

Page 4: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常 异常异常 (Exception)(Exception) 也叫例外。在也叫例外。在 JavaJava 编程语言中,异常就是编程语言中,异常就是程序在运行过程中由于硬件设备问题、软件设计错误、缺陷程序在运行过程中由于硬件设备问题、软件设计错误、缺陷等导致的程序错误。在软件开发过程中,很多情况都将导致等导致的程序错误。在软件开发过程中,很多情况都将导致异常的产生,例如:异常的产生,例如: (1) (1) 想打开的文件不存在;想打开的文件不存在; (2) (2) 网络连接中断;网络连接中断; (3) (3) 操作数超出预定范围;操作数超出预定范围; (4) (4) 正在装载的类文件丢失;正在装载的类文件丢失; (5) (5) 访问的数据库打不开;访问的数据库打不开; 可见,在程序中产生异常的现象是非常普遍的。在可见,在程序中产生异常的现象是非常普遍的。在 JavaJava 编编程语言中,对异常的处理有非常完备的机制。异常本身作为程语言中,对异常的处理有非常完备的机制。异常本身作为一个对象,产生异常就是产生一个异常对象。这个对象可能一个对象,产生异常就是产生一个异常对象。这个对象可能由应用程序本身产生,也可能由 由应用程序本身产生,也可能由 Java Java 虚拟机产生,这取决虚拟机产生,这取决于产生异常的类型。该异常对象中包括了异常事件的类型以于产生异常的类型。该异常对象中包括了异常事件的类型以及发生异常时应用程序目前的状态和调用过程。请看下面产及发生异常时应用程序目前的状态和调用过程。请看下面产生异常的例子。生异常的例子。

Page 5: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常【例【例 8-18-1 】】文件操作将产生异常文件操作将产生异常// Exception1.java// Exception1.javaimport java.io.*;import java.io.*;class Exception1 {class Exception1 { public static void main(String args[]){public static void main(String args[]){ FileInputStream fis =new FileInputStream("text.txt");FileInputStream fis =new FileInputStream("text.txt"); int b;int b; while((b=fis.read())!=-1) {while((b=fis.read())!=-1) { System.out.print(b);System.out.print(b); }} fis.close();fis.close(); }}}}

Page 6: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常当编译这个程序时,屏幕上会输出下面的信息:当编译这个程序时,屏幕上会输出下面的信息:D:\user\chap08>javac Exception1.javaD:\user\chap08>javac Exception1.javaException1.java:5: unreported exception java.io.FileNotFoundExceptioException1.java:5: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrownn; must be caught or declared to be thrown FileInputStream fis = new FileInputStream("text.txt");FileInputStream fis = new FileInputStream("text.txt"); ^̂Exception1.java:7: unreported exception java.io.IOException; must be Exception1.java:7: unreported exception java.io.IOException; must be caught or declared to be throwncaught or declared to be thrown while((b=fis.read())!=-1) {while((b=fis.read())!=-1) { ^̂Exception1.java:10: unreported exception java.io.IOException; must be Exception1.java:10: unreported exception java.io.IOException; must be caught ordeclared to be throwncaught ordeclared to be thrown fis.close();fis.close(); ^̂3 errors3 errors

Page 7: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常【例 【例 8-28-2 】】数组下标超界的例子数组下标超界的例子// Exception2.java// Exception2.javapublic class Exception2{public class Exception2{ public static void main (String args[]) { public static void main (String args[]) { String langs [] = {"Java","Visaul Basic","C++"};String langs [] = {"Java","Visaul Basic","C++"};int i = 0;int i = 0; while (i < 4) {while (i < 4) { System.out.println (langs[i]);System.out.println (langs[i]); i++;i++; }} }}}}

Page 8: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常程序的编译和运行结果如下:程序的编译和运行结果如下:D:\user\chap08>javac Exception2.java D:\user\chap08>javac Exception2.java D:\user\chap08>java Exception2D:\user\chap08>java Exception2JavaJavaVisaul BasicVisaul BasicC++C++Exception in thread "main" java.lang.ArrayIndexOutOfBouException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3ndsException: 3at Exception2.main(Exception2.java:8)at Exception2.main(Exception2.java:8)上面的例子编译可以通过,但运行时出现异常信息被抛出。在上面的例子编译可以通过,但运行时出现异常信息被抛出。在其循环被执行四次之后,数组下标溢出,程序终止,并带有其循环被执行四次之后,数组下标溢出,程序终止,并带有错误信息,就象前面所示的程序那样。错误信息,就象前面所示的程序那样。

Page 9: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常【例 【例 8-38-3 】】被被 00 除的例子除的例子// Exception3.java// Exception3.javaclass Exception3{class Exception3{ public static void main(String args[]){public static void main(String args[]){ int a=0;int a=0; System.out.println(5/a);System.out.println(5/a); }}}}我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下:D:\user\chap08>javac Exception3.javaD:\user\chap08>javac Exception3.javaD:\user\chap08>java Exception3D:\user\chap08>java Exception3Exception in thread "main" java.lang.ArithmeticException: / by zeroException in thread "main" java.lang.ArithmeticException: / by zero at Exception3.main(Exception3.java:5)at Exception3.main(Exception3.java:5)因为除数不能为因为除数不能为 00 ,所以在程序运行的时候出现了除以,所以在程序运行的时候出现了除以 00 溢出的异常事件。溢出的异常事件。

Page 10: 《 Java 程序设计之网络编程 》

8.1 8.1 什么是异常什么是异常 在上面的三个例子中,我们都遇到了异常。屏幕上所显示在上面的三个例子中,我们都遇到了异常。屏幕上所显示的信息的信息 java.io.java.io.IOExceptionIOException 、、 java.io.java.io.FileNotFoundExceptioFileNotFoundExceptionn 、 、 java.lang.java.lang.ArrayIArrayIndexOutOfBoundsExceptionndexOutOfBoundsException 以及以及 java.lang.java.lang.ArithmeticExceptioArithmeticExceptionn 分别指明了异常的类型以及分别指明了异常的类型以及异常所在的包异常所在的包。同时我们也可。同时我们也可以看到,对于某些异常,在程序中必须对它进行处理,否则以看到,对于某些异常,在程序中必须对它进行处理,否则编译程序会指出错误编译程序会指出错误 (( 如例如例 8-1)8-1) 。但对另一些异常,在程序。但对另一些异常,在程序中可以不做处理,而直接由运行时系统来处理中可以不做处理,而直接由运行时系统来处理 (( 如例如例 8-3)8-3) 。。在下节中,我们将详细了解这两类异常,以及在程序中如何在下节中,我们将详细了解这两类异常,以及在程序中如何处理这两类异常。处理这两类异常。

Page 11: 《 Java 程序设计之网络编程 》

第第 88 章 章 JavaJava 异常处理异常处理8.1 8.1 什么是异常什么是异常8.28.2 异常处理机制异常处理机制8.38.3 异常的处理异常的处理8.4 8.4 创建用户异常类创建用户异常类

Page 12: 《 Java 程序设计之网络编程 》

8.28.2 异常处理机制异常处理机制8.2.1 Java8.2.1 Java 的异常处理机制的异常处理机制8.2.2 8.2.2 异常类的类层次异常类的类层次8.2.3 Throwable8.2.3 Throwable 类的常用方法类的常用方法

Page 13: 《 Java 程序设计之网络编程 》

8.2.1 Java8.2.1 Java 的异常处理机制的异常处理机制 在 Java 程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。这个对象可能是由正在运行的方法生成,也可能由 Java 虚拟机生成,其中包含一些信息指明异常事件的类型以及当异常发生时程序的运行状态等。 Java 语言提供两种处理异常的机制: ( 1)捕获异常 在 Java 程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获 (catch) 异常。这是一种积极的异常处理机制。如果 Java 运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的 Java程序也将退出。 ( 2)声明抛弃异常当 Java 程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃( throws)异常。

Page 14: 《 Java 程序设计之网络编程 》

8.2.2 8.2.2 异常类的类层次异常类的类层次 前面已经提到,前面已经提到, JavaJava 是采用面向对象的方法来处理错误的,一个异常事件是是采用面向对象的方法来处理错误的,一个异常事件是由一个异常对象来代表的。这些异常对象都对应于类由一个异常对象来代表的。这些异常对象都对应于类 java.lang.Throwablejava.lang.Throwable 及其及其子类。下面我们就来看一下异常类的层次。子类。下面我们就来看一下异常类的层次。 在在 javajava 类库的每个包中都定义了自己的异常类,所有这些类都直接或间接地类库的每个包中都定义了自己的异常类,所有这些类都直接或间接地继承于类继承于类 ThrowableThrowable 。图。图 8-18-1列举了一些异常类并指明了它们的继承关系。列举了一些异常类并指明了它们的继承关系。 从图从图 8-18-1 可以看出,可以看出, JavaJava 中的异常事件分为两大类。一类继承于类中的异常事件分为两大类。一类继承于类 ErrorError ,它的,它的继承关系如下:继承关系如下: java.lang.Objectjava.lang.Object java.lang.Throwable java.lang.Throwable java.lang.Errorjava.lang.Error 常见的错误类有常见的错误类有 AnnotationFormatError, AssertionError, AWTError, LinkAnnotationFormatError, AssertionError, AWTError, LinkageError, CoderMalfunctionError, FactoryConfigurationError, ThreadDeath, ageError, CoderMalfunctionError, FactoryConfigurationError, ThreadDeath, VirtualMachineError, TransformerFactoryConfigurationErrorVirtualMachineError, TransformerFactoryConfigurationError 等,包括动态等,包括动态链接失败、线程死锁、图形界面错误、虚拟机错误等,通常链接失败、线程死锁、图形界面错误、虚拟机错误等,通常 JavaJava 程序不应该捕程序不应该捕获这类异常,也不会抛弃这种异常获这类异常,也不会抛弃这种异常。。

Page 15: 《 Java 程序设计之网络编程 》

8.2.2 8.2.2 异常类的类层次异常类的类层次另外一类异常则继承于类另外一类异常则继承于类 ExceptionException ,这是,这是 JavaJava 程序中所大量处理的异常。它的继程序中所大量处理的异常。它的继承关系如下:承关系如下: java.lang.Objectjava.lang.Object java.lang.Throwablejava.lang.Throwable java.lang.Exceptionjava.lang.Exception常见的异常类有:常见的异常类有: AclNotFoundException, ApplicationException, AWTException,AclNotFoundException, ApplicationException, AWTException, BackingStoreException, ClassNotFoundException, CloneNotSupportedExc BackingStoreException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DestroyFailedException, ExecutionException,eption, DataFormatException, DestroyFailedException, ExecutionException, PrintException, GeneralSecurityException, InterruptedException, InvalidPr PrintException, GeneralSecurityException, InterruptedException, InvalidPreferencesFormatException, eferencesFormatException, ParseExceptionParseException, RuntimeException, SAXExcept, RuntimeException, SAXException, SQLException, TimeoutException, TransformerException, Unsupportedion, SQLException, TimeoutException, TransformerException, UnsupportedCallbackException, UnsupportedLookAndFeelException, URISyntaxExceptiCallbackException, UnsupportedLookAndFeelException, URISyntaxExcepti

on, UserException, XAException, XMLParseException, XPathExceptionon, UserException, XAException, XMLParseException, XPathException 等等 其中包括了其中包括了运行时异常运行时异常和和非运行时异常。非运行时异常。

Page 16: 《 Java 程序设计之网络编程 》

8.2.2 8.2.2 异常类的类层次异常类的类层次

Page 17: 《 Java 程序设计之网络编程 》

8.2.2 8.2.2 异常类的类层次异常类的类层次

常见的运行时异常如下:(1) 类型转换异常 ClassCastExceptionString strName=new string(“123”);int nNumber=(int)strName; (2) 数组超界异常 ArrayIndexOutBoundsExceptionint[] b=new int[10];b[10]=1000;(3) 指定数组维数为负值异常NegativeArraySizeExceptionb[-1]=1001;

(4) 算术异常 ArithmeticExceptionint b=0;a=500/b;(5) Java系统内部异常 InternalExceptionJVM抛出的异常。(6) 类型不符合异常 IncompatibleTypeExceptionint n=12345;String s=(String)n; (7) 内存溢出异常 OutOfMemeoryException(8) 没有找到类定义异常 NoClassDefFoundExceptionaClass aa=new aClas(); // 但 aClass 类未定义。(9) 空指针异常 NullPointerExceptionint b[ ];b[0]=99; //没有实例化,就访问,将产生空指针。

Page 18: 《 Java 程序设计之网络编程 》

8.2.2 8.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.net,java.awt 等,都提供不同情况下可能产生的异常。由于异常的种类非常多,需要读者实际运用中逐渐掌握。

Page 19: 《 Java 程序设计之网络编程 》

8.2.3 Throwable8.2.3 Throwable 类的常用方法类的常用方法

java.lng.Throwable 类是所有 Error 类和 Exception 类的父类,常用的方法有 fillInStackTrace() 、 getLocalizedMessage() 、 getMessage() 、 printStackTrace() 、 printStackTrace(PrintStream) 、 printStackTrace(PrintWriter) 、toString() 。(1) public native Throwable fillInStackTrace()填写执行堆栈跟踪信息。 该方法在应用程序重新抛出错误或异常时有用。例如: try { a = b / c; } catch(ArithmeticThrowable e) { a = Number.MAX_VALUE; throw e.fillInStackTrace(); }(2) public String getLocalizedMessage()生成该 Throwable 的本地化描述。 子类可能会覆盖该方法以便产生一个特定于本地的消息。 对于未覆盖该方法的子类,缺省地返回调用 getMessage() 的结果。

Page 20: 《 Java 程序设计之网络编程 》

8.2.3 Throwable8.2.3 Throwable 类的常用方法类的常用方法

(3) public String getMessage()返回该 throwable 对象的详细信息。如果该对象没有详细信息则返回 null 。 (4) public void printStackTrace()把该 Throwable 和它的跟踪情况打印到标准错误流。(5) public void printStackTrace(PrintStream s)把该 Throwable 和它的跟踪情况打印到指定打印流。 (6) public void printStackTrace(PrintWriter s)把该 Throwable 和它的跟踪情况打印到指定打印流。(7) public String toString()返回该 throwable 对象的简短字符串描述。

Page 21: 《 Java 程序设计之网络编程 》

第第 88 章 章 JavaJava 异常处理异常处理8.1 8.1 什么是异常什么是异常8.28.2 异常处理机制异常处理机制8.38.3 异常的处理异常的处理8.4 8.4 创建用户异常类创建用户异常类

Page 22: 《 Java 程序设计之网络编程 》

8.3 8.3 异常的处理异常的处理8.3.1 8.3.1 捕获异常捕获异常 try-catch-finallytry-catch-finally8.3.2 8.3.2 声明抛弃异常声明抛弃异常8.3.3 8.3.3 抛出异常抛出异常

Page 23: 《 Java 程序设计之网络编程 》

8.3.1 8.3.1 捕获异常捕获异常 try-catch-finallytry-catch-finally

一个方法中如果对某种类型的异常对象提供了相应的处理代码,则这个方法可捕获该种异常。捕获异常是通过 try-catch-finally 语句实现的。其语法为:try{   ......    }catch( ExceptionName1 e ){    ......     }catch( ExceptionName2 e ){    ......    }    ......    }finally{    ......   }   1 、 try捕获异常的第一步是用 try{…}选定捕获异常的范围,由 try 所限定的代码块中的语句在执行过程中可能会生成异常对象并抛弃。

Page 24: 《 Java 程序设计之网络编程 》

8.3.1 8.3.1 捕获异常捕获异常 try-catch-finallytry-catch-finally

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

Page 25: 《 Java 程序设计之网络编程 》

8.3.1 8.3.1 捕获异常捕获异常 try-catch-finallytry-catch-finally

3 、 catch 语句的顺序  捕获异常的顺序和 catch 语句的顺序有关,当捕获到一个异常时,剩下的 catch 语句就不再进行匹配。因此,在安排 catch 语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。例如上面的程序如果安排成如下的形式:  try{     ......    }catch(IOException e ){     System.out.println( e );     System.out.println( "message: "+e.getMessage() );     e.printStackTrace( System.out );    }catch(FileNotFoundException e ){     System.out.println( e );    }由于第一个 catch 语句首先得到匹配,第二个 catch 语句将不会被执行。编译时将出现“ catch not reached”的错误。

Page 26: 《 Java 程序设计之网络编程 》

8.3.1 8.3.1 捕获异常捕获异常 try-catch-finallytry-catch-finally

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

Page 27: 《 Java 程序设计之网络编程 》

8.3.2 8.3.2 声明抛弃异常声明抛弃异常

如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,该方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。  声明抛弃异常是在一个方法声明中的 throws 子句中指明的。例如:   public int read () throws IOException{  …… }throws 子句中同时可以指明多个异常,之间由逗号隔开。例如: public static void main(String args[]) throws    IOException,IndexOutOfBoundsException { …… }最后,我们再次强调,对于非运行时例外,如前例中的 IOException等,程序中必须要作出处理,或者捕获,或者声明抛弃。而对于运行时例外,如前例中的 ArithmeticException , IndexOutOfBoundsException ,则可以不做处理。

Page 28: 《 Java 程序设计之网络编程 》

8.3.2 8.3.2 声明抛弃异常声明抛弃异常

【例 8-4 】抛弃异常的例子(对例 8-1 进行改进)// Exception4.javaimport java.io.*;public class Exception4{public static void main(String args[])throws FileNotFoundException,IOException{ FileInputStream fis=new FileInputStream(“text.txt”); int b; while((b=fis.read())!=-1){ System.out.print(b); }fis.close();}}

Page 29: 《 Java 程序设计之网络编程 》

8.3.2 8.3.2 声明抛弃异常声明抛弃异常

【例 8-5 】捕获异常的例子(对例 8-1 进行改进)import java.io.*;public class Exception5{public static void main(String args[]) {try{ FileInputStream fis=new FileInputStream(“text.txt”); int b; while((b=fis.read())!=-1){ System.out.print(b); }fis.close();}catch(FileNotFoundException e){     System.out.println( e );     System.out.println( "message: "+e.getMessage() );     e.printStackTrace( System.out );    }catch(IOException e){     System.out.println( e );   } } }

Page 30: 《 Java 程序设计之网络编程 》

8.3.3 8.3.3 抛出异常抛出异常 抛出异常就是产生异常对象的过程,首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出异常对象是通过 throw 语句实现的。  例如:   IOException e=new IOException();   throw e ;可以抛出的异常必须是 Throwable或其子类的实例。下面的语句在编译时将会产生语法错误: throw new String("throw anything"); 自定义异常类必须是 Throwable 的直接或间接子类。 

Page 31: 《 Java 程序设计之网络编程 》

8.3.3 8.3.3 抛出异常抛出异常【例 8-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(); } } }

Page 32: 《 Java 程序设计之网络编程 》

8.3.3 8.3.3 抛出异常抛出异常程序运行结果如下 :d:\user\chap08>java Exception6Caught ExceptiongetMessage():My ExceptiongetLocalizedMessage():My ExceptiontoString():java.lang.Exception: My ExceptionprintStackTrace():java.lang.Exception: My Exceptionat Exception6.main(Exception6.java:5)

Page 33: 《 Java 程序设计之网络编程 》

8.3.3 8.3.3 抛出异常抛出异常

例 8-7 】 try-catch-finally 嵌套的例子class MyoneException extends Exception {}public class TryInbed { public static void main(String[] args) { System.out.println("Entering first try block"); try { System.out.println("Entering second try block"); try { throw new MyoneException(); } finally { System.out.println("finally in 2nd try block"); } //try-catch-finally 嵌套在 try 限定的范围内。 } catch (MyoneException e) { System.err.println("Caught MyoneException in 1st try block"); } finally { System.err.println("finally in 1st try block"); } }}

Page 34: 《 Java 程序设计之网络编程 》

8.3.3 8.3.3 抛出异常抛出异常

程序运行结果如下:Entering first try blockEntering second try blockfinally in 2nd try blockCaught MyoneException in 1st try blockfinally in 1st try block

Page 35: 《 Java 程序设计之网络编程 》

第第 88 章 章 JavaJava 异常处理异常处理8.1 8.1 什么是异常什么是异常8.28.2 异常处理机制异常处理机制8.38.3 异常的处理异常的处理8.4 8.4 创建用户异常类创建用户异常类

Page 36: 《 Java 程序设计之网络编程 》

8.4 8.4 创建用户异常类创建用户异常类

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

Page 37: 《 Java 程序设计之网络编程 》

8.4 8.4 创建用户异常类创建用户异常类

我们在使用异常时,有以下几点建议需要注意:(1) 对于运行时例外,如果不能预测它何时发生,程序可以不做处理,而是让 Java 虚机去处理它。(2) 如果程序可以预知运行时例外可能发生的地点和时间,则应该在程序中进行处理,而不应简单地把它交给运行时系统。 (3) 在自定义异常类时,如果它所对应的异常事件通常总是在运行时产生的,而且不容易预测它将在何时、何处发生,则可以把它定义为运行时例外,否则应定义为非运行时例外。

Page 38: 《 Java 程序设计之网络编程 》

8.4 8.4 创建用户异常类创建用户异常类

。【例 8-8 】用户定义的异常类的使用// Exception8.javaclass MyotherException extends Exception { // 用户定义的异常 public MyotherException() { } public MyotherException(String msg) { super(msg); }}

Page 39: 《 Java 程序设计之网络编程 》

8.4 8.4 创建用户异常类创建用户异常类public class Exception8 { public static void f() throws MyotherException { System.out.println("Throwing MyotherException from f()"); throw new MyotherException(); } public static void g() throws MyotherException { System.out.println("Throwing MyotherException from g()"); throw new MyotherException("Originated in g()"); } public static void main(String[] args) { try { f(); } catch (MyotherException e) { e.printStackTrace(); } try { g(); } catch (MyotherException e) { e.printStackTrace(); }}}

Page 40: 《 Java 程序设计之网络编程 》

8.4 8.4 创建用户异常类创建用户异常类 程序的运行结果如下:程序的运行结果如下: Throwing MyotherException from f()Throwing MyotherException from f() Throwing MyotherException from g()Throwing MyotherException from g() MyotherExceptionMyotherException at Exception8.f(Exception8.java:13)at Exception8.f(Exception8.java:13) at Exception8.main(Exception8.java:21)at Exception8.main(Exception8.java:21) MyotherException: Originated in g()MyotherException: Originated in g() at Exception8.g(Exception8.java:17)at Exception8.g(Exception8.java:17) at Exception8.main(Exception8.java:26)at Exception8.main(Exception8.java:26)