【CS61B】Lab3-Debugging2

  • ~1.51K 字
  1. 1. Lab3-Debugging2
    1. 1.1. 学会阅读堆栈追踪
    2. 1.2. Debug BeeCountingStage
    3. 1.3. Debug SpeciesListStage
    4. 1.4. Debug PalindromeStage
    5. 1.5. Debug MachineStage

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中已经执行了相加操作并返回和,应该删除一个

赞助喵
非常感谢您的喜欢!
赞助喵