第15章异常捕获和枚举类型

上传人:pu****.1 文档编号:591861371 上传时间:2024-09-18 格式:PPT 页数:44 大小:330.54KB
返回 下载 相关 举报
第15章异常捕获和枚举类型_第1页
第1页 / 共44页
第15章异常捕获和枚举类型_第2页
第2页 / 共44页
第15章异常捕获和枚举类型_第3页
第3页 / 共44页
第15章异常捕获和枚举类型_第4页
第4页 / 共44页
第15章异常捕获和枚举类型_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《第15章异常捕获和枚举类型》由会员分享,可在线阅读,更多相关《第15章异常捕获和枚举类型(44页珍藏版)》请在金锄头文库上搜索。

1、Chapter 15异常处理异常处理补充:枚举类型补充:枚举类型语法错误,编译错误,逻辑错误 Syntax errors (语法法错误)-编译过程中出程中出现的的错误,通,通过编译器器检测。 Runtime errors (运行(运行时错误)引起程序非正常中)引起程序非正常中断的断的错误。 Logic errors (逻辑错误)指程序没有按期望的要)指程序没有按期望的要求求执行。行。2 2运行错误 如果这行出现异常,将跳过其余的行,程序终止。如果这行出现异常,将跳过其余的行,程序终止。3 3捕获运行错误捕获运行错误4 4异常类(Exception Classes)page 4465 5系统错误

2、(System Errors)System errors 是由是由JAVA虚虚拟机抛出并在机抛出并在Error类中描述的。中描述的。Error类描述类描述内部的系统错误。这种错内部的系统错误。这种错误很少发生,如果发生,误很少发生,如果发生,除了通知用户以及尽量稳除了通知用户以及尽量稳妥地结束程序外,几乎什妥地结束程序外,几乎什么也不能做。么也不能做。page 4466 6异常(Exceptions)Exceptions 是由是由Exception类描述的。描述的。 Exception类描述由程序类描述由程序和外部环境引起的错误,和外部环境引起的错误,这些错误能通过程序捕这些错误能通过程序捕获

3、和处理。获和处理。 page 4467 7Runtime ExceptionsRuntime exceptions 是由是由 RuntimeException 类描述编类描述编程错误,比如不合适的转换,程错误,比如不合适的转换,访问一个越界数值或数值错访问一个越界数值或数值错误等。运行异常通常由误等。运行异常通常由JAVA虚拟机抛出。虚拟机抛出。page 4468 8必检异常和免检异常RuntimeException, Error 以及它们的子类以及它们的子类都称为免检异常(都称为免检异常(unchecked exceptions). 所有其他异常都称为必检异常(所有其他异常都称为必检异常(c

4、hecked exceptions).unchecked exception是程序设计中不可重获的逻辑错误。是程序设计中不可重获的逻辑错误。checked exception编译器强制程序员检查并处理异常编译器强制程序员检查并处理异常9 9必检异常和免检异常Unchecked ExceptionsJava 不能保证你的代不能保证你的代码能够捕获或声明码能够捕获或声明unchecked exceptions.说明说明:Exception类及子类及子类都是是可以捕获的,类都是是可以捕获的,但是但是JVM只强制你捕获只强制你捕获checked Excepions.1010声明、抛出、捕获异常catc

5、h exceptiondeclare exceptionthrow exception1111声明异常声明异常声明异常(声明异常(declaring exceptions)-每个方法每个方法都必都必须说明它可能抛出的必明它可能抛出的必检异常的异常的类型型. 如:如:public void myMethod() throws IOException public void myMethod() throws IOException, OtherException 1212抛出异常抛出异常(抛出异常(throwing an exception)程序)程序检测到一个到一个错误后,后,创建一个适当建一

6、个适当类型异常的型异常的实例例并抛出它。并抛出它。这里有一个例子:里有一个例子:throw new TheException(); TheException ex = new TheException();throw ex;1313抛出异常 /* Set a new radius */ public void setRadius(double newRadius) throws throws IllegalArgumentExceptionIllegalArgumentException if (newRadius = 0) radius = newRadius; else throw new

7、 IllegalArgumentException( Radius cannot be negative); 1414捕获异常 try statements; / Statements that may throw exceptionscatch (Exception1 exVar1) handler for exception1;catch (Exception2 exVar2) handler for exception2;.catch (ExceptionN exVar3) handler for exceptionN; page 4481515java.lang.Throwable 方

8、法public String getMessage()返回返回Throwable对象的详细信息对象的详细信息public String toString()返回返回3个字符串合起来的串,它们分别是:异常个字符串合起来的串,它们分别是:异常类名的全称;类名的全称; “:”一个一个冒号冒号和一个空格;和一个空格; getMessage()方法。方法。public void printStackTrace()在控制台上输出在控制台上输出Throwable对象及其踪迹信息对象及其踪迹信息。1616例例15.1 声明、抛出和捕获异常声明、抛出和捕获异常 问题:问题: 本例演示如何声明、抛出和捕获异本例演

9、示如何声明、抛出和捕获异常,改写常,改写6.10 节中节中setRadius 方法,如果半方法,如果半径是径是负的,新的的,新的 setRadius 方法抛出一个方法抛出一个异常。异常。TestCircleWithExceptionCircleWithExceptionpage 4491717outputjava.lang.IllegalArgumentException: Radius cannot be negativeNumber of objects created: 1System.out.println(ex);is equivalent toSystem.out.println(

10、ex.toString();例15.1(续) 说明:在此例中,由于说明:在此例中,由于IllegalArgumentException是一个是一个RuntimeException (unchecked Exception),所以在测试程序中若没有编写,所以在测试程序中若没有编写try-catch代码,编译代码,编译时不会报错,只会在运行时抛出异常。时不会报错,只会在运行时抛出异常。(栈跟踪栈跟踪)1818输出输出 (no try-catch block)Exception in thread main java.lang.IllegalArgumentException: Radius can

11、not be negativeat CircleWithException.setRadius(CircleWithException.java:30)at CircleWithException.(CircleWithException.java:15)at TestCircleWithException.main(TestCircleWithException.java:5)例15.1(续)说明:若把程序中的说明:若把程序中的try-catch都删除,就会显示以上的运行效果,从运行中可都删除,就会显示以上的运行效果,从运行中可以看出异常栈的跟踪次序。以看出异常栈的跟踪次序。另外,若保留另外

12、,若保留try-catch块,在代码中执行块,在代码中执行ex.printStackTrace()也可以显示异也可以显示异常栈。常栈。1919捕获或声明异常Java 强强迫程序迫程序员处员处理必理必检检异常异常如果方法声明了一个必如果方法声明了一个必检检异常,必异常,必须须在在try-catch 块块中中调调用它或者在用它或者在调调用它方法中声明抛出异常。例如用它方法中声明抛出异常。例如, 假假设设方方法法 p1 调调用方法用方法 p2 。方法。方法 p2 将抛出一个异常将抛出一个异常 (e.g., IOException), 程序程序员员必必须须按照按照(A) 和和(B)编编写程序写程序.

13、(A)(B)2020Catching Exceptionsmain method . try . invoke method1; statement1; catch (Exception1 ex1) Process ex1; statement2;method1 . try . invoke method2; statement3; catch (Exception2 ex2) Process ex2; statement4;method2 . try . invoke method3; statement5; catch (Exception3 ex3) Process ex3; state

14、ment6;An exception is thrown in method3page 4492121Note 在在catch子句中制定异常的顺序是非常重要子句中制定异常的顺序是非常重要的。的。try catch(Exception ex) catch (RuntimeExcepiton ex) wrongtry catch (RuntimeExcepiton ex) catch(Exception ex) correctpage 552page 4492222重新抛出异常try statements;catch(TheException ex) perform operations befo

15、re exits; throw ex;语句语句 throw ex 重新抛出异常,以便其他处理器获得处理异常重新抛出异常,以便其他处理器获得处理异常ex的机的机会。会。2323finally 子句try statements;catch(TheException e) handling e; finally finalStatements; 说明:无论之前的说明:无论之前的try和和catch块中发生了什么,以下块中发生了什么,以下finally代码块中的代码代码块中的代码都都一定一定会执行:会执行:try代码块执行完成,没有发生异常;代码块执行完成,没有发生异常;try代码块发生异常,被某个代

16、码块发生异常,被某个catch代码块处理;代码块处理;try代码块发生异常,没有被任何一个代码块发生异常,没有被任何一个catch代码块处理。代码块处理。Note:Catch blocks are unnecessary if a finally block is present:try finally 2424如何使用异常异常处理可以将错误处理代码从正常的编程异常处理可以将错误处理代码从正常的编程任务分离出来,这样可以使程序变得容易阅任务分离出来,这样可以使程序变得容易阅读和修改,然而应该注意,由于异常处理需读和修改,然而应该注意,由于异常处理需要初始化新的异常对象并重返调用堆栈,并要初始化

17、新的异常对象并重返调用堆栈,并且通过方法调用链传播异常以便搜寻异常处且通过方法调用链传播异常以便搜寻异常处理器。理器。2525何时抛出异常一个方法出一个方法出现异常异常时,如果想,如果想让该方法的方法的调用者用者处理异常,理异常,应该创建一个异常建一个异常对象并象并对其抛出。如果能在其抛出。如果能在发生生 异常的方法中异常的方法中处理异理异常,那么就不需要抛出异常。常,那么就不需要抛出异常。2626何时使用异常在代在代码中,中,应该什么什么时候使用候使用try-catch块?当必?当必须处理不可理不可预料的料的错误时应该使用。不要用使用。不要用try-catch块处理理简单、可、可预料的情况。

18、例如下述代料的情况。例如下述代码: try System.out.println(refVar.toString();catch (NullPointerException ex) System.out.println(refVar is null);2727何时使用异常最好用以下代最好用以下代码代替代替 if (refVar != null) System.out.println(refVar.toString();else System.out.println(refVar is null);注意:不要用异常捕获来解决那些可以用注意:不要用异常捕获来解决那些可以用if语句判断的简单错误。语

19、句判断的简单错误。 2828创建异常类要创建自定义异常类型,需要利用继承来要创建自定义异常类型,需要利用继承来扩展某个预定义扩展某个预定义Java异常类。通常是直接异常类。通常是直接扩展通用的扩展通用的Exception类:类:public class MissingValueException extends Exception 最简单的自定义异常类:最简单的自定义异常类:public class MissingValueException extends Exception 选讲选讲2929自定义异常类简单的自定义异常类:简单的自定义异常类:public class MissingValu

20、eException extends Exception /Constructorpublic MissingValueException(String message) super(message);Exception类包含了类包含了public Exception(String message)方方法;法;Exception类包含了类包含了String getMessage()方法,用于将这方法,用于将这个传入的个传入的message信息显示出来信息显示出来;因此自定义的异常类可以调用因此自定义的异常类可以调用super(message);方法初始方法初始化父类,并且此自定义类也自动继承了

21、化父类,并且此自定义类也自动继承了getMessage()方方法,用于显示异常信息串。法,用于显示异常信息串。3030程序举例public class MissingValueException extends Exception private Student student;public MissingValueException(Student s, String message) super(message);student = s;public Student getStudent() return student;定义异常类,此类存储在定义异常类,此类存储在MissingValue

22、Exception.java文件中。文件中。3131程序举例public class Student private String name;private String ssn;public String getSsn() . public void setSsn() . public String getName() . public void setName(String n) throws MissingValueException if (n.equals() throw new MissingValueException(this,A students name cannot be

23、 blank);else name = n;/ etc.使异常类在使异常类在Student类中类中运作。运作。3232程序举例public class Example public static void main(String args) String name = read value from GUI;Student s = new Student();s.setName(name);/ etc.在试图调用在试图调用setName方法的那行代码上将产生编译错误:方法的那行代码上将产生编译错误:Unreported exception MissingValueException; must

24、 be caught or declared to be thrown s.setName(name);因为在因为在Student类的类的setName方法声明中包含了方法声明中包含了throws MissingValueException子句,子句,java编译器强制客户代码捕获这个类型编译器强制客户代码捕获这个类型的异常。的异常。伪代码伪代码3333程序举例public class Example public static void main(String args) String name = read value from GUI;Student s = new Student();

25、try s.setName(name);catch (MissingValueException e) System.out.println(e.getMessage();System.out.println(ID of affected student: +e.getStudent().getSsn();/ etc.输出结果:输出结果:A students name cannot be blankID of affected student: 123-45-6789伪代码伪代码此处假设在调用此处假设在调用setName之前之前已经为已经为ssn属性赋了初值。属性赋了初值。3434补充: 枚举

26、类型枚举类型将变量的取值约束到一个有限的集合。将变量的取值约束到一个有限的集合。例如:只希望学位的取值为:例如:只希望学位的取值为:MathematicsBiologyChemistryComputer SciencePhysical Education 为保证客户代码不会传入一个不正确的专业值,因此创造为保证客户代码不会传入一个不正确的专业值,因此创造一个自定义异常类型一个自定义异常类型InvalidMajorExcetion,代码如下所,代码如下所示:示:JDK 1.5特征特征3636public class Student private String name;private Stri

27、ng major;public Student(String name, String major) throws InvalidMajorException this.setName(name);if (major not one of the five approved majors) throw new InvalidMajorException();else this.setMajor(major);/ 在运行时,若传入错误的参数,则会丢出异常在运行时,若传入错误的参数,则会丢出异常try Student s = new Student(Dorothy Jost, Culinary A

28、rts); catch (InvalidMajorException e) . 此例的缺点在于:只有在此例的缺点在于:只有在运行运行时异常才能发生,不时异常才能发生,不能防止客户代码在能防止客户代码在编译编译时时进行错误检测。进行错误检测。3737枚举类型的定义public enum Major / Define name/value pairsMath(Mathematics),Bio(Biology),Chem(Chemistry),CS(Computer Science),PhysEd(Physical Education);/Declare the value attribute to

29、 be of type String.private final String value;/ The constructor takes a String argument.Major(String v) value = v;/ The method has a return type of String.public String value() return value;3838枚举类型的使用public class Student private String name;private Major major;public Student(String name, Major majo

30、r) this.setName(name);this.setMajor(major);public void setName(String n) name = n;public void setMajor(Major m) major = m;public void display() System.out.println(name + is a + major.value() + major.);3939枚举类型的使用public class EnumExample public static void main(String args) Student s = new Student(Fr

31、ed Schnurd, Major.CS);s.display();Output:Fred Schnurd is a Computer Science major./ 如果把如果把display()方法中的方法中的major.value()改为改为major:public void display() System.out.println(name + is a + major + major.);Output:Fred Schnurd is a CS major.4040枚举类型的使用采用枚举类型之后,如果客户代码传入了采用枚举类型之后,如果客户代码传入了错误的专业信息,则错误的专业信息,则

32、Java会在编译时进行会在编译时进行提示:提示:Student s = new Student(Fred Schnurd, Basketweaving);Student s = new Student(Fred Schnurd, Major.Basketweaving);4141枚举的另一个例子public enum Grade A(4.0),B(3.0),C(2.0),D(1.0),F(0.0);private final double value;Grade(double v) value = v;public double value() return value;public clas

33、s GradeDemo public static void main(String args) Grade grade;grade = Grade.A;System.out.println(grade);System.out.println(grade.value();Heres the output:A4.04242封装enum类型public enum StudentBody fred(new Student(Fred),mary(new Student(Mary);private final Student value;StudentBody(Student value) this.v

34、alue = value;public Student value() return value;public class EnumExample public static void main(String args) Student x = StudentBody.fred;.这个例子使用引用类这个例子使用引用类型(型(Student)作为)作为封装的封装的enum类型。类型。当以枚举形式当以枚举形式StudentBody.fred调用枚举类型调用枚举类型StudentBody时,时,它会自动创建对应的它会自动创建对应的Student对象。对象。4343JDK1.5之前采用全局静态常量实现

35、类似功能之前采用全局静态常量实现类似功能public class Student private String name;private String major;public static final String BIO = Biology;public static final String CHEM = Chemistry;public static final String MATH = Mathematics;public static final String CS = Computer Science;public static final String PHYS_ED = Physical Education;public Student(String name, String major) this.name = name;this.major = major;Student s = new Student(Bobby Cranston, Student.CS);此方法的缺点是:此方法的缺点是:当传入错误的参数时,编译器无法阻止无效参数的调用。当传入错误的参数时,编译器无法阻止无效参数的调用。4444

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

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