《java简明教程》chap9

上传人:kms****20 文档编号:40491322 上传时间:2018-05-26 格式:DOC 页数:16 大小:46KB
返回 下载 相关 举报
《java简明教程》chap9_第1页
第1页 / 共16页
《java简明教程》chap9_第2页
第2页 / 共16页
《java简明教程》chap9_第3页
第3页 / 共16页
《java简明教程》chap9_第4页
第4页 / 共16页
《java简明教程》chap9_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《《java简明教程》chap9》由会员分享,可在线阅读,更多相关《《java简明教程》chap9(16页珍藏版)》请在金锄头文库上搜索。

1、JAVAJAVA 简明教程简明教程chap9chap9第九章 异常处理9.1 Java 的异常控制机制捕获错误最理想的是在编译期,最好在试图运行程序以前。然而,并非所有错误都能在编译期间侦测到。有些问题必须在运行期间解决。让错误的缔结者通过一定的方法预先向接收者传递一些适当的信息,使其知道可能发生什么样的错误以及该如何处理遇到的问题,这就是 Java 的异常控制机制。“异常” (Exception)这个词表达的是一种正常情况之外的“异常” 。在问题发生的时候,我们可能不知具体该如何解决,但肯定知道已不能不顾一切地继续下去。此时,必须坚决地停下来,并由某人、某地指出发生了什么事情,以及该采取何种

2、对策。异常机制的另一项好处就是能够简化错误控制代码。我们再也不用检查一个特定的错误,然后在程序的多处地方对其进行控制。此外,也不需要在方法调用的时候检查错误(因为保证有人能捕获这里的错误) 。我们只需要在一个地方处理问题:“异常控制模块”或者“异常控制器” 。这样可有效减少代码量,并将那些用于描述具体操作的代码与专门纠正错误的代码分隔开。一般情况下,用于读取、写入以及调试的代码会变得更富有条理。若某个方法产生一个异常,必须保证该异常能被捕获,并获得正确对待。Java 的异常控制机制的一个好处就是允许我们在一个地方将精力集中在要解决的问题上,然后在另一个地方对待来自那个代码内部的错误。那个可能发

3、生异常的地方叫做“警戒区” ,它是一个语句块,我们有必要派遣警探日夜监视着。生成的异常必须在某个地方被捕获和进行处理,就象警察抓到嫌疑犯后要带到警署去询问。这个地方便是异常控制模块。“警戒区”是一个 try 关键字开头后面用花括号括起来的语句块,我们把它叫作“try 块” 。当 try 块中有语句发生异常时就掷出某种异常类的一个对象。异常被异常控制器捕获和处理,异常控制器紧接在 try 块后面,且用 catch 关键字标记,因此叫做“catch 块” 。catch 块可以有多个,每一个用来处理一个相应的异常,因为在“警戒区”内可能发生的异常种类不止一个。所以,异常处理语句的一般格式是:try

4、/ 可能产生异常的代码catch (异常对象 e) /异常 e 的处理语句catch (异常对象 e1) /异常 e 的处理语句catch (异常对象 e2) /异常 e 的处理语句即使不使用 try-catch 结构,发生异常时 Java 的异常控制机制也会捕获该异常,输出异常的名称并从异常发生的位置打印一个堆栈跟踪。然后立即终止程序的运行。下面的例子发生了一个“零除”异常,后面的 hello 没有被打印。例 1 没有作异常控制的程序。/public class Exception1 public static void main(String args) int b = 0;int a =

5、 3 / b;System.out.println(“Hello!“);/输出结果:java.lang.ArithmeticException: / by zeroat Exception1.main(Exception1.java:5)Exception in thread “main“ Exit code: 1There were errors但是如果使用了 try-catch 来处理异常,那么在打印出异常信息后,程序还将继续运行下去。下面是处理了的代码。/ Exception2.javapublic class Exception2 public static void main(Str

6、ing args) try int b = 0; int a = 3 / b;catch(ArithmeticException e) e.printStackTraceSystem.out.println(“Hello!“);/输出结果:Exception:java.lang.ArithmeticException: / by zeroat Exception2.main(Exception1.java:5)Hello!与前例不同的是,Hello!被输出了。这就是 try-catch 结构的用处,它使异常发生和处理后程序得以“恢复”而不是“中断” 。9.2 异常类、异常规范和 throw 语

7、句为了使异常控制机制更出色地发挥它的功效,Java 设计者几乎所以可能发生的异常,预制了各色各样的异常类和错误类。它们都是从“可掷出”类 Throwable 继承而来的,它派生出两个类 Error 和Exception。由 Error 派生的子类命名为 XXXError,其中词 XXX 是描述错误类型的词。由 Exception 派生的子类命名为XXXException,其中词 XXX 是描述异常类型的词。Error 类处理的是运行使系统发生的内部错误,是不可恢复的,唯一的办法只要终止运行运行程序。因此,客户程序员只要掌握和处理好 Exception类就可以了。Exception 类是一切异常

8、的根。现成的异常类非常之多,我们不可能也没有必要全部掌握它。好在异常类的命名规则大致描述出了该类的用途,而异常类的方法基本是一样的。下面给出 lang 包中声明的部分异常类。RuntimeException 运行时异常NullPointerException 数据没有初始化就使用IndexOutOfBoundsException 数组或字符串索引越界NoSuchFieldException 文件找不到NoSuchMethodException 方法没有定义ArithmeticException 非法算术运行在其他包中也有相关的异常类,例如 io 包中有 IOEception 类。利用异常的命名

9、规则,你可以使用下面的 DOS 命令在包所在的目录查看有什么异常类可用:DIR *Eception.class 对于运行时异常 RuntimeException,我们没必要专门为它写一个异常控制器,因为它们是由于编程不严谨而造成的逻辑错误。只要让出现终止,它会自动得到处理。需要程序员进行异常处理的是那些非运行期异常。Throwable 有三个基本方法:String getMessage() 获得详细的消息。String toString() 返回对本类的一段简要说明,其中包括详细的消息(如果有的话) 。void printStackTrace() 或 void printStackTrace(

10、PrintStream)打印出调用堆栈路径。调用堆栈显示出将我们带到异常发生地点的方法调用的顺序。因为 Exception 类是一切异常的根,所以对任何一个现有的异常类都可以使用上述方法。异常规范和 throwsjava 库程序员为了使客户程序员准确地知道要编写什么代码来捕获所有潜在的异常,采用一种叫做 throws 的语法结构。它用来通知那些要调用方法的客户程序员,他们可能从自己的方法里“掷”出什么样的异常。这便是所谓的“异常规范” ,它属于方法声明的一部分,即在自变量(参数)列表的后面加上 throws 异常类列表。例如void f() throws tooBig, tooSmall, d

11、ivZero 方法体若使用下述代码:void f() / .它意味着不会从方法里“掷”出异常(除类型为 RuntimeException的异常以外,它可能从任何地方掷出) 。如果一个方法使用了异常规范,我们在调用它时必须使用 try-catch 结构来捕获和处理异常规范所指示的异常,否则编译程序会报错而不能通过编译。这正是 Java 的异常控制机制的杰出贡献,它对可能发生的意外及早预防从而加强了代码的健壮性。在使用了异常规范的方法声明中,库程序员使用 throw 语句来掷出一个异常。throw 语句的格式为:throw new XXXException();由此可见,throw 语句掷出的是

12、XXX 类型的异常的对象(隐式的句柄) 。而 catch 控制器捕获对象时要给出一个句柄 catch(XXXException e)。我们也可以采取“欺骗手段” ,用 throw 语句“掷”出一个并没有发生的异常。编译器能理解我们的要求,并强迫使用这个方法的用户当作真的产生了那个异常处理。在实际应用中,可将其作为那个异常的一个“占位符”使用。这样一来,以后可以方便地产生实际的异常,毋需修改现有的代码。下面我们用“欺骗手段”给出一个捕获异常的示例程序。例 2 本例程演示异常类的常用方法。/public class ExceptionMethods public static void main(

13、String args) try throw new Exception(“Heres my Exception“); catch(Exception e) System.out.println(“Caught Exception“);System.out.println(“e.getMessage(): “ + e.getMessage();System.out.println(“e.toString(): “ + e.toString();System.out.println(“e.printStackTrace():“);e.printStackTrace();/该程序输出如下:Caug

14、ht Exceptione.getMessage(): Heres my Exceptione.toString(): java.lang.Exception: Heres my Exceptione.printStackTrace():java.lang.Exception: Heres my Exceptionat ExceptionMethods.main在一个 try 区中潜在的异常可能是多种类型的,那时我们需要用多个 catch 块来捕获和处理这些异常。但异常发生时掷出了某类异常对象,Java 依次逐个检查这些异常控制器,发现与掷出的异常类型匹配时就执行那以段处理代码,而其余的不会被

15、执行。为了防止可能遗漏了某一类异常控制器,可以放置一个捕获 Exception 类的控制器。Exception 是可以从任何类方法中“掷”出的基本类型。但是它必须放在最后一个位置,因为它能够截获任何异常,从而使后面具体的异常控制器不起作用。下面的示例说明了这一点。例 3 本例程演示多个异常控制器的排列次序的作用。/public class MutilCatch private static void test(int i) try int x = i;if (x0)throw new ArithmeticException (“this is a Arithmetic Exception!“)

16、;else if (x0)throw new NullPointerException (“this is a NullPointer Exception!“);elsethrow new Exception(“this is a Exception!“); catch(ArithmeticException e) System.out.println(e.toString(); catch(NullPointerException e) System.out.println(e.toString(); catch(Exception e) System.out.println(e.toString();public static void main(String args) test(-1); tes

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号