哈工大软件构造实验lab4

14.1 Error and Exception Handling
AtomStructure
可能会遇到的问题1.输入大小写问题,2.文件存在问题 3.信息数量问题4.信息翻转问题5.信息格式,6.该是数字录入字母问题7.没有中心8,录入的电子数量信息与其实际的轨道数不符
针对2,4,5,这类问题,正则表达式要是匹配不打就抛出异常,表示文件存在问题,在main函数里处理,即直接break,重新输入文件名。对于其余问题,对匹配到的语句各自进行处理来看是否成功。为每种异常分别写了测试类并进行了测试。
StellarSystem
可能会遇到的问题:1.信息数量问题 2.大于一万的数用科学计数法3.旋转方向不对4.初始角度大小5.word类型6.不能出现重名星球7.不能出现相同轨道半径的星球,不能没有中心处理,建立了StellarSystemException类来处理如果正则表达是匹配不到抛出异常,说明文件格式有误解决了1,类问题,其他的问题用StelarSystemException来抛出含含字符串不同的异常,通过在主函数捕获这些异常来处理这些异常。
并写了相应的文件来测试。

SocialCircleSystem
可能会遇到的异常1。物体数量2。物体格式3.年龄为正整数4.性别类型5.亲密度为0——1 6。亲密度的人是否出现指向自己的,7关系中出现朋友中没有的名字,同上建立SocialException类并抛出相应的异常,在主函数中处理,并写了相应的测试来测试是否抛出该异常 。

14.2 Assertion and Defensive Programming
14.2.1 checkRep()检查invariants
AtomStructure
检查方式: assert this.Tracks.size()>=this.trackobject.size();,检查轨道数量和电子组集合大小是否相等
StellarSystem
检查assert this.Tracks.size()>=this.trackobject.size();
for(Set aSet:this.trackobject)
{
assert aSet.size()<=1;

    }

即检查轨道数与星球数是否相等。

SocialCircleSystem

int j=0;
for(int i=0;i<this.trackobject.size();i++)
{
for(Friend aFriend :this.trackobject.get(i))
{
j++;
}
}
assert j ==allfriend.size();
即检查朋友数量和加入该关系网络的是否相等

14.2.2 Assertion保障pre-/post-condition
对于增加和减少元素的地方,每次检查是否加入和减少成功
14.3 Logging
14.3.1 写日志
使用log4j库
对于每个用户的选项,执行一次之后就将其加入日志,加入日志的debug级别,对于捕获到每个异常时,将其信息加入error级别。
14.3.2 日志查询
用正则表达式进行匹配,如果符合要求,就加入字符串数组,最后输出字符串数组
这里选择用时间段进行查询,输入时刻

14.4 Testing for Robustness and Correctness
14.4.1 Testing strategy
为每种异常写各自的文件,并进行测试,测试各种不合法的数据
14.4.2 测试用例设计
如果捕捉到想要的异常,就证明可以处理相应的情况,鉴于这种思想,
设计时进行
File aFile = new File(“test/ConcreteCirculartest/file/So7.txt”);
try {
testa.Readfile(aFile);
System.out.println(testa.getFriend(“Tom”));
assertEquals(1, 0);
} catch (SocialNetworkCircleException e) {
assertEquals(1, 1);
来判断是否捕捉到异常
14.4.3 测试运行结果与EclEmma覆盖度报告

14.5 SpotBugs tool
对于不使用的变量,应该删掉
x % 2 == 1应该改为x%2!=0,防止出现负数
14.6 Debugging
14.6.1 理解待调试程序的代码思想
FindMedianSortedArrays:
思想:这里采用了一种比较独特的算法来取中位数,由于输入数组是两个有序数组,所以这里将两个数组定义分别分割成左右两部分,
A [0],A [1],…,A [i-1] | A [i],A [i + 1],…,A [m-1]
B [0],B [1],…,B [j-1] | B [j],B [j + 1],…,B [n-1]这两部分满足1)left_part.size() == right_part.size() (2)max(left_part)<= min(right_part)
那么我们将{A,B}中的所有元素划分为两个长度相等的部分,一个部分总是大于另一个部分。然后中值=(max(left_part)+ min(right_part))/ 2。
为了确保这两个条件,只需要确保:
(1)i + j == m-i + n-j(或:m-i + n-j + 1)
如果n> = m,我们只需要设置:i = 0〜m,j =(m + n + 1)/ 2-i
(2)B [j-1] <= A [i],A [i-1] <= B [j]
在[0,m]中搜索i,找到一个切分点i(j =(m + n + 1)/ 2-i):
使得B [j-1] <= A [i]和A [i-1] <= B[j]。
我们可以按照以下步骤进行搜索:
<1>设置imin = 0,imax = m,然后开始搜索[imin,imax]
<2>设置i =(imin + imax)/ 2,j =(m + n + 1)/ 2-i
<3>现在left_part.size() == right_part.size()。而且只有3种情况:
(1) B[j-1] <= A [i]和A [i-1] <= B [j]
意味着找到了切分点i,停止搜索。
(2) B[j-1]> A [i]
意味着A [i]太小。必须调整i得到B [j-1] <= A [i]。而i只能增加不能减小,因为当i减小时j将增加,因此,B [j-1]增加并且A [i]减小,永远不会满足。所以必须增加i。也就是说,调整搜索范围为[i + 1,imax]。因此,imin = i + 1和然后回到第<2>步。
(3) A [i-1]> B [j]
意味着A [i-1]太大,必须减少i得到A [i-1] <= B [j]。因此,设置imax = i-1然后回到第<2>步。

RemoveComments:
该算法是是设计标记变量inBlock,开始将其设为false ,表示为碰到”/”,若碰到,则将其变为false,防止记录/ *** /中的信息,将原字符数组每个字符串转为char【】型,通过判断是否为/ /中信息来将/ */ 中的信息去掉

TopVotedCandidate:
该算法用A来记录某个时间点的获胜者,再用二分查找来在里面查找获胜者是谁。

14.6.2 发现并定位错误的过程
FindMedianSortedArrays:
看来整个函数,发现判断奇数偶数的部分不太对
(m + n + 1) % 2 == 1
应该是判断为奇数就返回最左边最大值,这里不应该再+1
RemoveComments:
首先,发现最后if (inBlock && newline.length() > 0) {
ans.add(new String(newline));
}
这里inblock错位,这里应该是false时表示可以加入,而这里确实inBlock为为真时可以加入。
其次,调试时发现将/也加入了改结果,用debug发现是最后判断*/时,由于判断char[i]和
Char【i+1】时提前将inblock置为false,导致将这个加入
同时发现缺少了判断//出现的情况处理的结果
int c = count.getOrDefault(p, 1);这里应该是c是p这个人当前的得票数+1,即指这个人在这时候得票
int j = Math.max(lo, 0);这里应该lo-1
if (A.get(i).get(mi).time < t)
这里应该改成<=
14.6.3 如何修正错误
FindMedianSortedArrays:

改为(m + n ) % 2 == 1
RemoveComments:
将判断是否到/的条件改为(i>2&&inBlock && i <line.length() && chars[i-1] == '’ && chars[i] == ‘/’),这样就不会提前修改inblock了,需要注意的是,应该加一个判断i是否>2
,其实是为了避免开始时访问char[-1]导致数组越界。
同时加入if(i <line.length() -1&&chars[i]==’/’&&chars[i+1] == ‘/’)//加入判断//这个功能
{
break;
}
来处理//时的情况。
int c = count.getOrDefault(p, 1);这里应该是c是p这个人当前的得票数+1,即指这个人在这时候得票即改为int c = count.getOrDefault(p, 0) 指这个人要是没票则将他得票置零后+1
否则取出他得的票+1
int j = Math.max(lo, 0);这里改成lo-1
if (A.get(i).get(mi).time < t)
这里应该改成<=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值