软件构造lab4实验报告

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Error and Exception Handling 2
3.1.1 处理输入文本中的三类错误 2
3.1.2 处理客户端操作时产生的异常 2
3.2 Assertion and Defensive Programming 2
3.2.1 checkRep()检查rep invariants 2
3.2.2 Assertion/异常机制来保障pre-/post-condition 2
3.2.3 你的代码的防御式策略概述 2
3.3 Logging 2
3.3.1 异常处理的日志功能 2
3.3.2 应用层操作的日志功能 2
3.3.3 日志查询功能 2
3.4 Testing for Robustness and Correctness 2
3.4.1 Testing strategy 2
3.4.2 测试用例设计 2
3.4.3 测试运行结果与EclEmma覆盖度报告 2
3.5 SpotBugs tool 2
3.6 Debugging 3
3.6.1 EventManager程序 3
3.6.2 LowestPrice程序 3
3.6.3 FlightClient/Flight/Plane程序 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 4
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4

1实验目标概述
本次实验重点训练学生面向健壮性和正确性的编程技能,利用错误和异常处
理、断言与防御式编程技术、日志/断点等调试技术、黑盒测试编程技术,使程序
可在不同的健壮性/正确性需求下能恰当的处理各种例外与错误情况,在出错后
可优雅的退出或继续执行,发现错误之后可有效的定位错误并做出修改。
实验针对 Lab 3 中写好的 ADT 代码和基于该 ADT 的三个应用的代码,使用
以下技术进行改造,提高其健壮性和正确性:
错误处理
异常处理
Assertion 和防御式编程
日志
调试技术
黑盒测试及代码覆盖度

2实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

在Eclipse的Market中安装了Spotbugs

3实验过程
请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

3.1Error and Exception Handling
3.1.1处理输入文本中的三类错误
软件构造lab4实验报告
3.1.2处理客户端操作时产生的异常
软件构造lab4实验报告
软件构造lab4实验报告
软件构造lab4实验报告
软件构造lab4实验报告

3.2Assertion and Defensive Programming
3.2.1checkRep()检查rep invariants
软件构造lab4实验报告
软件构造lab4实验报告
软件构造lab4实验报告
3.2.2Assertion/异常机制来保障pre-/post-condition

3.2.3你的代码的防御式策略概述

3.3Logging
3.3.1异常处理的日志功能

软件构造lab4实验报告
软件构造lab4实验报告
3.3.2应用层操作的日志功能
软件构造lab4实验报告
软件构造lab4实验报告
软件构造lab4实验报告
软件构造lab4实验报告
软件构造lab4实验报告
3.3.3日志查询功能

3.4Testing for Robustness and Correctness
3.4.1Testing strategy

3.4.2测试用例设计

3.4.3测试运行结果与EclEmma覆盖度报告

3.5SpotBugs tool
发现了哪些错误,每种错误代表什么不良的编程习惯
对代码修改,消除这些错误。
(1)没有对输入字符串检查是否为空
软件构造lab4实验报告
添加函数checknull用来检查字符串是否为空
软件构造lab4实验报告

3.6Debugging
3.6.1EventManager程序
(1)代码思想
实现一个EventManager类来管理个人日程,通过该类的一个方法 book(int day, int start, int end)来添加新事件。待添加的新事件发生在day,这是一个整数,表示一年里的第day天。start表示事件的起始时间,为该day天的第start小时。end表示该事件的结束时间,为该day天的第end小时。
“k-重叠”是指:有k个事件的时间范围在某个时间段内存在交集,即这k个事件在某个小时内都已经启动且尚未结束。 book(…)方法的返回值是:当本次调用结束后的最大k值。

(2)修正错误
①TreeMap的引用需要进行参数化
软件构造lab4实验报告

②temp的values需要先赋值0,不然随后无法遍历
软件构造lab4实验报告
③把book传入的start和end加上(day-1)*24
软件构造lab4实验报告
④把该事件的时间段每个小时的value+1
软件构造lab4实验报告
⑤截出该事件的时间段,只遍历它的values
软件构造lab4实验报告
(3)测试结果
软件构造lab4实验报告
3.6.2LowestPrice程序
(1)代码思想
实现LowestPrice类来计算购买商品最优惠的方式。通过该类的一个方法shopping(List price, List<List> special, List needs)来计算最优惠的价格,price为一系列商品的价格,special为一系列优惠方案,needs为需要的各种商品数量。最后返回所有商品的最优惠价格
(2)修正错误
①遍历needs时不能越界
软件构造lab4实验报告
②diff为负数时要退出循环
软件构造lab4实验报告
③s.get()里应该是j,这样获得优惠套餐的总价
软件构造lab4实验报告
(3)测试结果
软件构造lab4实验报告
3.6.3FlightClient/Flight/Plane程序
(1)代码思想
实现FlightClient类来给一系列航班在不冲突的情况下分配飞机。通过类中的方法planeAllocation(List planes, List flights)来判断并分配飞机,返回boolean值。
(2)修正错误
①重写Collection.sort方法,让flights按照出发时间排序
软件构造lab4实验报告
②把随机数改成自然数,随机数不能确定哪次循环后planes遍历完
软件构造lab4实验报告
软件构造lab4实验报告

③第一次循环时都没有分配飞机,要考虑到这个情况
软件构造lab4实验报告
④把标志变量改为true,结束循环
软件构造lab4实验报告
⑤找不到分配方法就退出循环,返回false
软件构造lab4实验报告
(3)测试结果

软件构造lab4实验报告