红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lab3-Debugging2

Lab3-Debugging2

给予项目Adventure来进行调试并修改代码

学会阅读堆栈追踪

运行主方法后,会在某个位置抛出异常:

一般作物类型会在报错第一行出现,如该处出现错误:NullPointerException

对于这一类的异常,java也会抛出解释,这里指的是this.inputnull,因此我们不能调用方法

下方表示程序引发错误时的方法调用序列:列表中的第一行是错误发生的位置,其下一行表示调用抛出错误方法的代码行,依此类推。

可以点击蓝色文本追踪到对应文件和方法行处

注意:按照执行顺序,堆栈追踪第一行错误显示的应为发生错误时最后调用的方法,可以根据此来判断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 >= aw = 0z = -1,结果为 (b & 0) | (a & -1),返回 a
  • b < aw = -1z = 0,结果为 (b & -1) | (a & 0),返回 b

因此这里返回的是最小值,而非最大值,应该将z与w对调

第二个问题出在arraySum处,这里要求数组最大值之和

但代码行sum = sum + mysteryAdd(sum, x[i]);明显多加了一个sum,因为mysteryAdd中已经执行了相加操作并返回和,应该删除一个