3.4 调试

在编写代码中,我们无可避免会犯各种错误。主要是以下三种:
1.语法错误。 这类错误编程环境直接显示为红色,有语法错误的代码是无法执行的。
典型的语法错误是:缺少分号,括号不匹配,变量没有定义,代码没有写在某个大括号内,变量名或函数名重复等等
2.逻辑错误。 代码可以运行,但运行结果是错的。
例如找两个数的最小公倍数,结果是1。这类错误是代码的逻辑或者计算有问题。
3.异常。 代码可以运行,但是某些情况下,会出错。异常属于意外的情况,例如连接数据库的时候断网了,于是会有超时异常
比较典型有:除0,当变量是除数并且它的值是0的时候,就会出现异常;给负数开平方;操作值是空值(null)的对象。
而调试,是专门用来解决逻辑错误的。那什么是调试呢?
调试就是在程序执行的过程中,允许一行一行执行代码并且观察变量的一种技术。必须由编程工具提供。在指定的断点(也就是某行代码)停止后,此时可以观察变量的值,还有以下的选择:
1.指定执行下一行。
2.进入下一行中的函数。
3.跳出目前正在执行的函数。
4.执行到下一个断点 断点就是运行调试后代码要停止的位置,如果没有断点直接调试,和直接执行是一个效果的。
设置断点也很简单,在代码左侧蓝色边栏双击(双击数字那一栏也可以,如果没有出现行数,可以右键点击然后选择显示行数,英文是Show Line Numbers),就会出现蓝色的小圆形,如图所示,35行设置了断点:
接下来我们启动调试,和运行方式一样,可以从菜单、文件右键以及菜单图标启动调试,三种方式都是一样的:
1.从菜单启动
2.在类文件右键菜单
3.菜单栏点击debug图标
启动调试后,就进入调试界面,如果是首次启动,会弹出框确认,点击确定就可以了。我们可以看到,代码在断点处停了下来,绿色底色的代码表示停在了这行代码前,还未被执行
1.函数调用栈 这里显示的是函数的调用关系,例如main函数调用了A函数,A函数又调用了B函数之类,只有B函数完成了,A函数才能结束(因为B函数调用就是A函数里面的一条语句),以此类推,A函数完成了,main函数才能继续下去。栈是计算机里面一种数据结构,表示后进先出,例如有一口井,放下了三块和井口一样大小的大石头,如果取出石头,那就是最后放进去的石头先拿出来。函数调用就是使用这样的结构来表示调用的先后顺序。 其实人类也是这样的思维方式,例如要做画画作业,发现没有画纸,于是出去买纸,这样买纸必须完成了,才能完成画画。 更具体的内容,请参照第七章函数的递归。
2.变量观察区 可以在这里看到当前变量的值是多少
3.代码和输出 这里和普通界面是一样的
4.控制按钮 这几个按钮决定了代码停下来后怎么办
(1)绿色箭头。执行代码直到下一个断点
(2)红色方块。停止执行。
(3)第一箭头。执行一行代码,如果这行代码里面有别的函数调用,那么进入该函数。
(4)第二箭头。执行一行代码,就算这行代码里面有别的函数调用,也是执行一行代码。

 (5)第三箭头。执行一行代码,执行完当前函数。如果当前代码不是在函数内部(main函数除外),这个按钮是不可用的。
如图,调试启动后,要执行本行语句,按一次第二个箭头,执行本行:
可以看到,代码执行了一行,并且注意变量观察区,这里显示y的值是8。说明func函数计算出结果了(func函数是绝对值函数)。

如果需要进入func函数逐条语句执行,那么我们要重新再启动一次调试,毕竟func函数已经执行完了。
启动调试后,要按下第一个箭头,我们发现代码停止在第40行:
这个时候,我们可以发现,函数调用栈里显示了func函数第40行,main函数第35行。这是目前停止下来的顺序,也是函数执行的顺序:func函数执行完,就回到main函数第35行。 变量观察区可以看到x的值是-8,这个x是func函数的参数,是main函数第35行代码的调用传进来的。 最后,我们还发现了第三个箭头终于亮了
这是因为第三个箭头是执行完当前函数,回到调用者,具体这里就是:执行完func(func内如果有断点的话,还是会停在断点),回到调用者main第35行。没有函数调用,这个按钮是灰色不可用的。