530 likes | 666 Views
专题三 异常处理. 案例一 异常处理. 上章回顾. 抽象 是认识世界,表达思想的一种方式 目的是了解事物的特征与本质,并基于已有事物创建新的事物 学习创建抽象类 抽象类和抽象方法 (abstract 关键字) 理解接口的概念及特征 数据传输的通道,对外提供服务并隐藏实现细节 标准、规范、契约,稳定、不易改变 掌握接口在 Java 开发中的具体应用 创建接口( interface 关键字) 实现接口( implements 关键字). 专题目标. 本专题主要介绍应用 Java 语言提供的异常处理机制处理运行时错误的方法。具体包含如下内容:
E N D
专题三 异常处理 案例一 异常处理
上章回顾 • 抽象 • 是认识世界,表达思想的一种方式 • 目的是了解事物的特征与本质,并基于已有事物创建新的事物 • 学习创建抽象类 • 抽象类和抽象方法(abstract关键字) • 理解接口的概念及特征 • 数据传输的通道,对外提供服务并隐藏实现细节 • 标准、规范、契约,稳定、不易改变 • 掌握接口在Java开发中的具体应用 • 创建接口(interface关键字) • 实现接口(implements关键字)
专题目标 • 本专题主要介绍应用Java语言提供的异常处理机制处理运行时错误的方法。具体包含如下内容: • 1. 理解异常的概念与特点 • 2. 掌握Java语言处理运行时错误的方法 • 3. 学习使用日志工具记录程序异常
本章目标 • 理解异常的概念 • 学习Java异常体系结构 • 掌握Java中的异常处理方法 • 自身处理(try、catch、finally关键字) • 显式抛出(throw、throws关键字) • 学习什么是日志 • 了解使用JDK提供日志工具记录程序异常
工作任务 3-1 • 为了配合甲型H1N1流感的检测工作,“未来之星”医学研究所决定开发一套人体电子测温系统。该系统应具备以下的功能: • 1. 可以手工设置预警温度 • 2. 可以存储最近三个体温测量结果值 • 3. 当体温超过预警温度时,测温系统会发出“嘟…嘟…嘟…”的警报音
工作任务 3-2 • 请根据以上要求设计并实现: • Person类,该类封装了体温检测人的特征,包括: • 属性:姓名、身体温度【初始化为36.5℃】 • 行为:发烧 • Thermomer类,该类封装了电子测温计的特征,包括: • 属性:预警温度【默认37.0℃】、最近的检测结果 • 行为:测量人体温度、显示最近的检测结果 • H1N1Exception自定义异常类,封装了预警信息
工作任务 3-3 • 参考实现结果
相关实践10-1 • 1.创建名为subject3的Java项目,并在src源文件夹下创建Person类
相关实践10-2 • 创建Person类-2
相关实践10-3 • 2.创建H1N1Exception异常类 创建自定义异常
相关实践10-4 • 3. 创建Thermometer温度计类-1 :
相关实践10-5 • 创建Thermometer电子温度计-2 处理异常
相关实践10-6 • 创建Thermometer电子温度计-3:
相关实践10-7 • 4.创建H1N1Test测试类 :
相关实践10-8 • 测试类的运行结果
相关实践10-9 • 使用日志工具类记录测量结果
相关实践10-10 • 再次运行测试类的结果
总结-1 • 异常的概念 • 程序的运行时错误 • 学习Java异常体系结构 • Throwable • Error • Exception • RuntimeException及其子类 • 受检异常 • 掌握Java中的异常处理方法 • 自身处理(try、catch、finally关键字) • 显式抛出(throw、throws关键字) • 根据需要创建自定义异常
总结-2 • 日志的概念 • 程序运行过程中输出的额外信息,记录了程序的运行情况 • 了解JDK提供的日志工具类 • Logger类
异常-1 • 生活中的异常 • 在始料未及的情况下出现的各种问题 如何对待这些突发事件?!
异常-2 • 如何处理异常? • 未雨绸缪,居安思危 • 尽可能消除出现异常的各种因素,避免异常的发生。 • 亡羊补牢,化险为夷 • 当异常发生时,应采取正确的方式进行处理。 • 及时求助,转危为安 • 如果对已发生的异常情况没有能力处理,应及时向第三方求助,让有经验的部门或系统帮助进行解决。
异常-3 • 程序开发中的错误 • 语法错误 • 导致程序无法通过编译 • 运行时错误 • 导致程序异常终止 • 逻辑错误 • 运行的结果不正确
Java异常体系结构-1 • Java中的异常 • Java是一门具有面向对象特征的编程语言,所以使用面向对象的思想表示并处理程序中产生的异常。 • 待解决的问题 • 如何表示异常? • 将异常根据特征分类,将异常信息封装到对象中 • 异常产生时怎么办? • 为开发人员提供了完善的异常处理机制
Java异常体系结构-2 • Java中的异常体系结构
Java异常体系结构-3 • Throwable类 • 所有异常类的父类,位于java.lang包中。它的实例是具体的异常对象,封装了特定的异常信息。 • 方法 • getMessage():获取异常对象封装的信息。 • printStackTrace():打印方法调用栈中的详细异常信息。在程序开发中的调试阶段使用,可以跟踪错误产生的位置。 • Throwable类有两个子类 • Error类 • Exception类
Java异常体系结构-4 • Error类 • 代表系统级别的严重错误,应用程序无法处理。例如VirtualMachineError、OutOfMemoryError等 • 出现Error错误时,建议终止应用程序 • Exception类 • 代表应用程序级别的错误,可以被捕获并处理 • 应尽可能处理Exception类型的错误,以保证程序出现异常后仍能正常运行或结束 • Exception类分为运行时异常和受检异常
Java异常体系结构-5 • 运行时异常 • 包括RuntimeException类及其子类。例如NullPointerException、ClassCastException、IndexOutOfBoundsException。 • 不必显示处理,编译器也不进行检查 • 受检异常 • 除RuntimeException类之外的其他Exception(及其子类) • 必须进行显示处理,否则编译出错
Java异常体系结构-6 • 常见的运行时异常类
自定义异常-1 • 为什么创建自定义异常? • JDK中提供的异常类只能表示有限的错误种类,对于特定的问题领域需要更加具体的描述信息 • 如何创建自定义异常? • 基于Exception类进行扩展 • 如何使用自定义异常? • 根据条件显式抛出自定义异常的对象
自定义异常-2 • Exception类的构造方法
自定义异常-3 • 基于Exception类创建自定义异常
处理异常-1 • Java中的异常处理机制 • 将异常处理与程序的正常流程分离,使得逻辑更加清晰,有利于系统将来的维护。 • 异常处理的方式比较灵活。可以考虑让代码段自己处理产生的异常,也可以把异常抛给相关的调用者进行处理。 • 与异常处理相关的关键字 • try、catch、finally • throw、throws
处理异常-2 • 自身处理-1 • try...catch结构 出现异常时,控制权将转移至catch块
处理异常-3 • 自身处理-2 • try…catch结构 • 使用try块将可能出现异常的代码包围 • 如果需要处理异常,在try块后添加至少一个catch块 • 注意: • try块和catch块都不能单独使用 • try块后可以跟随一个或多个catch块 • catch语句块必须跟在一个try块后面
处理异常-4 • 问题: 如果汽车启动或运行时出现了问题将不会执行stop方法!
处理异常-5 • 自身处理-3 • try…catch…finally结构 • 为了保证必要的步骤在异常出现后仍旧可以被执行,Java异常处理机制提供了try…catch…finally结构。
处理异常-6 • 自身处理-4 • try…catch…finally结构 如果汽车启动或运行时出现了问题也能确保汽车停下来。
处理异常-7 • 自身处理-4 • try…catch…finally结构 • 注意: • finally块不能单独使用 • finally块和catch块都是可选块 • 如果使用,它必须跟在一个try块之后,且只能出现一次 • 无论是否出现异常,finally块中的代码一定会被执行
处理异常-8 • 调用者处理-1 • 除了方法自身可以处理异常之外,还可以将产生的异常交由方法的调用者去处理。 • 为什么让调用者去处理呢? • 方法本身不具备处理某种异常的能力 • 集中处理运行时异常,减轻程序员的编码工作,提高代码的可读性 问题:如果碰到了司机无法处理的严重问题又该怎么办呢? (如机械故障、失火等)
处理异常-9 • 调用者处理-2 在方法声明处使用throws关键字向调用者说明可能抛出的异常类型 根据不同的情况,使用throw关键字抛出指定的错误对象
处理异常-10 • 对于受检异常必须“显式处理” • 使用try…catch结构捕获并处理错误 • 在方法声明中加入throws关键字,向方法调用者说明可能抛出异常的种类 • throw与throws的区别 • throw用于显式抛出异常对象,只能用于方法体内; • throws用来说明方法可能会抛出的异常对象,只能出现在方法声明处。
日志-1 • 什么是日志? • 程序运行过程中输出的额外信息 Windows操作系统的“事件查看器”
日志-2 • 日志有什么用? • 帮助开发人员分析系统的缺陷,迅速修正错误,用户也可以从日志信息中得到详细的描述信息,以检测当前系统的状态。
日志-3 • 日志记录了哪些内容? 记录时间 记录类别 位置信息 记录内容
日志-4 • 使用Java日志工具类 • 从JDK1.4开始,Sun就在Java开发工具中提供了日志管理工具类。 • 日志工具类具有以下特点 • 日志管理工具一般都会具有以下的特点: • 可以方便控制日志的输出与否 • 可以方便的控制日志输出的级别 • 多种日志输出方式(控制台、文件、数据库) • 丰富的、可以自定义的输出格式 • 利用配置文件管理日志记录环境
日志-5 • 使用Java日志API的具体步骤-1 • 使用java.util.logging.Logger获得给定名字的日志记录器 • 日志记录器的命名与包名类似,可以具有一定的层次结构,但层次结构比包更强,即日志记录器之间可以建立类似继承的关系,因此父与子之前可以共享某些属性。
日志-6 • 使用Java日志API的具体步骤-2 • 设置或取得日志记录器的级别 • SEVERE:代表严重失败 • WARNING:代表存在潜在问题 • INFO::代表普通消息 • CONFIG:代表静态配置消息(系统配置信息:例如CPU的类型) • FINE:跟踪信息级别,代表极少量(且非常重要)的消息 • FINER:代表一条相当详细的跟踪消息,例如输入、返回或抛出异常的日志记录调用 • FINEST:代表一条最详细的跟踪消息。 • SEVERE代表最高的级别,FINEST代表最低的级别。它们都可以通过java.util.logging.Level类以常量的方式直接调用。
日志-7 • 使用Java日志API的具体步骤-2 • 除了上述7个常量外,Level类还定义了另外两个常量: • ALL:代表记录所有消息 • OFF:代表关闭日志记录
日志-8 • 使用Java日志API的具体步骤-3 • 设置日志处理器(Handler)。日志处理器(Handler)代表日志输出的目的地。 • JDK提供的日志API支持将日志内容输出到控制台(ConsoleHandler)、文件(FileHandler)和网络(SocketHandler)
日志-9 • 使用Java日志API的具体步骤-4 • 使用Logger类提供log方法向日志处理器输出日志信息 • level代表输出日志的级别,msg代表具体的日志描述 注意:日志记录器只能输出大于等于当前级别的日志信息。