什么是调试
学到继承,我们已经做出了相当大的程序(第13课)。可是做出来的程序,总会在某个地方出错。一个错字、一个错误的假设就够了。出错不是失败,而是常有的事;冷静地把它找出来改好,就叫调试。
停下的位置就是第一条线索
程序出错时,不会悄无声息地死掉,而是停在某个地方。
然后它会指着那里说:“这儿,这一行。”
这个指向就是最宝贵的第一条线索。错误信息首先告诉你停在了哪里。
按下运行,步骤会依次亮起,在出错的地方一下停住。
停在哪里,一眼就能看出来。
接着,那里会跳出红色的字。
很多人一看到红字就先慌了,其实它是站在我们这边的。
红字不是责备,而是提示
红字不是在骂我们。
它是一张便条,写着计算机哪里没弄懂。
通常里面有两样东西:位置(哪里)和种类(什么),比如“这不是数字”“没有这个名字”。
只要学会冷静地读它,问题就解决了一半。
点一下信息的片段,“哪里”和“什么”就会分开亮起来。
把信息拆成“哪里”和“什么”来读,原本吓人的红字一下子变得友好了。
可是信息指的位置,不一定总是真正的原因。
程序很长的话,怎样才能快速缩小原因的范围?
把范围一半一半地缩小
不知道错误在哪里时,不要从头读到尾,先看中间。
到这里都正常吗?正常的话,错误就在后半段;不正常,就在前半段。然后再对半分。
这样一半一半地缩小,再长的代码也能很快找到“元凶”。
每按一次“检查中间”,就会根据正常还是有问题,把范围缩小一半。
按了几次,范围就缩到了一个地方。
不用把全部看一遍,就准确揪出了元凶。
找到原因了,接下来该修改了,可修改时有个容易掉进去的陷阱。
一次只改一处,再检查
看到像是原因的东西,也不能一下子全改。
同时改五个地方,就算改好了,也不知道是哪一处起了作用。
就算出了新问题,也不知道是谁造成的。
所以只改一处,运行一下,看一看。
只改一个候选再按“检查”,原因就清楚了;同时改好几个,就分不清是哪个起了作用。
一处一处地改,真正的原因就清楚了。
准确地找到元凶,也改好了。
那么就结束了吗?还差一步,因为“好像改好了”和“改好了”是两回事。
改完以后,一定要再运行一遍确认
光觉得改好了还不算完。
要再运行一遍,亲眼看到它从头到尾通过,才算结束。
顺便还要检查一下,原本正常的其他地方有没有被弄坏。
这一圈“改好再确认”,就是区分瞎猜和真正修好的界线。
按“再运行一遍”,改好的程序就会一路绿灯通过。
现在我们既会编写(第1~13课),也会在出错时找出问题并改好(第14课)。
可是我们写下的这些字,是怎样变成机器真正运行的东西的?
下一课我们就沿着这条路,看看文字怎样变成机器的工作。