Lab3-Debugging2
给予项目Adventure来进行调试并修改代码
学会阅读堆栈追踪
运行主方法后,会在某个位置抛出异常:
一般作物类型会在报错第一行出现,如该处出现错误:NullPointerException
对于这一类的异常,java也会抛出解释,这里指的是this.input为null,因此我们不能调用方法
下方表示程序引发错误时的方法调用序列:列表中的第一行是错误发生的位置,其下一行表示调用抛出错误方法的代码行,依此类推。
可以点击蓝色文本追踪到对应文件和方法行处
注意:按照执行顺序,堆栈追踪第一行错误显示的应为发生错误时最后调用的方法,可以根据此来判断bug的位置等
Debug BeeCountingStage
根据错误信息发现,错误应该出现在BeeCountingStage中,我们跳入该类进行检查
此处抛出空指针的原因是this.input还是空指针,未被初始化,因此我们需要对input初始化
可以发现声明变量处代码为private List<String> input;,再看构造函数发现这两处均为对input初始化,故我们在构造函数中添加初始化代码this.input = new ArrayList<>(0);即可解决问题
第二个问题还是出现在该类中,错误类型为IndexOutOfBoundsError
经检查,是sumInput函数中,for循环的终止条件多了等号,导致多访问了一位没有定义的位置
Debug SpeciesListStage
错误类型为/ by zero,跟踪到函数arraySimilarity
发现在return处计算相似度时,若询问结束,还会传入一次空字符串,即listOne的size为0,导致除以0的错误发生
所以若传入的是空字符串,我们需要特定的返回0
Debug PalindromeStage
错误类型:Index 3 out of bounds for length 3
我们进入类PalindromeStage,根据IDEA的warning提示,来到函数digitsToIntList
容易发现第一个bug出在for循环中,对计数器i的操作有误,此处为反向遍历,i应该自减
第二个bug也在for循环中,对于s的下标,最后一位应该是s.length()-1,第一位应该是0,这样避免charAt方法出现异常
Debug MachineStage
该机器的作用是将输入的两个等长数列的每位进行比较,选出每个下标中更大的那一位,并组成一个新数组并求和,但目前结果有误
第一个问题出在mysteryMax处,这里对b-a获得了两个掩码
- 当
b - a >= 0时,w为 0, - 当
b - a < 0时,w为 -1(即全 1)
然后z为w的取反,获得的是相反结果,max的计算等价于
- 若
b >= a:w = 0,z = -1,结果为(b & 0) | (a & -1),返回a - 若
b < a:w = -1,z = 0,结果为(b & -1) | (a & 0),返回b
因此这里返回的是最小值,而非最大值,应该将z与w对调
第二个问题出在arraySum处,这里要求数组最大值之和
但代码行sum = sum + mysteryAdd(sum, x[i]);明显多加了一个sum,因为mysteryAdd中已经执行了相加操作并返回和,应该删除一个