嘿!不应那样做!找出逻辑错误
更新:2007 年 11 月
在本课中,您将学习如何查找程序中的逻辑错误。
在前面的课程中,您学习了如何查找并修复编译器错误和运行时错误。还有一种编程错误是逻辑错误,这种错误是最难发现的。您根本不会收到有关逻辑错误方面的警告——程序将运行,但提供的是不正确的结果。因此,您必须通读代码,确定出现错误的原因。
幸好,Visual Basic 中的调试工具可在这方面提供帮助。两项调试技术,即设置“断点”和“单步执行”代码,可以帮助您逐行检查代码以找出错误。
您可以在“代码编辑器”中为任何可执行代码行设置断点。当程序运行到该代码行时,断点会强制程序停止并进入中断模式。此时便可及时获取您想要了解的有关程序在该时间点的状态的任何信息。然后,您可以检查任何变量的值,在“即时”窗口中测试表达式,或者使用“编辑并继续”功能修改代码。
进入中断模式后,便可以单步执行代码,每次执行一行代码,以便确定代码的运行情况。按 F8 键可以执行当前代码行并在下一行处停止。然后,您便可以检查变量的值,查看它们在从一行代码执行到下一行代码时是如何更改的。
如果当前这行代码需要调用代码中其他位置的某个函数或者 Sub 过程,按 F8 将会进入并单步执行该过程。单步执行完该过程后,将转到调用该过程的代码行的下一行。如果不想单步执行某个过程,可以按 Shift+F8 一次执行整个过程。
试一试!
观测逻辑错误
在“文件”菜单上,选择“新建项目”。
在“新建项目”对话框的“模板”窗格中,单击“Windows 应用程序”。
在“名称”框中键入 LogicErrors,然后单击“确定”。
一个新的 Windows 窗体项目随即打开。
双击“Button1”以打开代码编辑器。
在 Button1_Click 事件处理程序中,添加下面的代码。
Dim minutes As Integer = CInt(Textbox1.Text) Dim miles As Double = CDbl(Textbox2.Text) Dim hours As Double = 0 hours = minutes / 60 MsgBox("Average speed " & GetMPH(hours, miles))
在 End Sub 的下一行,添加下面的函数。
Function GetMPH(ByVal miles As Double, ByVal hours As Double) _ As String GetMPH = CStr(miles / hours) End Function
按 F5 运行程序。在第一个文本框中输入 10(表示 10 分钟),在第二个文本框中输入 5(表示 5 英里),然后单击“Button1”。
此时将出现一个消息框,其中显示有消息“Average speed 0.03333334”(平均速度为 0.03333334);但是,如果您 10 分钟行驶了 5 英里,则正确的答案应为每小时 30 英里。
将项目保持为打开状态——在下一个过程中,您将学习如何查找逻辑错误。
找出逻辑错误
在上一个示例中,程序逻辑存在明显的错误。根据结果,您的旅行速度还不到每小时一英里,而不是像您所期望的那样是每小时 30 英里。那么,错误究竟出在哪里呢?
在下一个过程中,您将设置断点并单步执行代码以找出错误。
试一试!
设置断点并单步执行代码
在代码编辑器中找到 hours = minutes / 60 行,然后在该行代码左边的空白处单击。
空白处应出现一个红点,并且该行代码应以红色突出显示,这表示一个断点。
按 F5 再次运行程序。在第一个文本框中输入 10,在第二个文本框中输入 5。然后单击“Button1”。
程序运行到断点处时将会停止。hours = minutes / 60 行将以黄色突出显示。
将鼠标放在变量上以检查变量的值,hours 的值应为 0,而 minutes 的值应为 10。
按 F8 执行 hours = minutes / 60 行并单步执行下一行。
检查 MsgBox("Average speed " & GetMPH(hours, miles)) 行中的变量值,此时 MsgBox("Average speed " & GetMPH(hours, miles)) 的值应为 MsgBox("Average speed " & GetMPH(hours, miles)),而 MsgBox("Average speed " & GetMPH(hours, miles)) 的值应为 MsgBox("Average speed " & GetMPH(hours, miles))。
再次按 F8 执行当前行。
注意执行进行到 Function GetMPH 行。
检查此行上的变量值,您应该注意到:此时 miles 的值为 0.166666672,而 hours 的值此时为 5.0,与它们在前面一行上的结果相反。您已找到了错误。
使项目保持为打开状态,在下一个过程中您将学习如何修复逻辑错误。
修复逻辑错误
在前面的过程中,变量 miles 和 hours 的值交换了位置。您能够找出其中的原因吗?
如果您查看 MsgBox("Average speed " & GetMPH(hours, miles)) 这一行,您将发现给 MsgBox("Average speed " & GetMPH(hours, miles)) 函数按先后顺序传递了两个参数:MsgBox("Average speed " & GetMPH(hours, miles)) 和 MsgBox("Average speed " & GetMPH(hours, miles))。查看函数声明 Function GetMPH(ByVal miles As Double, ByVal hours As Double)... 时,您将注意到这些参数列出的顺序是 miles 排在第一位,而 hours 排在第二位。
发生逻辑错误的原因是,参数的传递顺序不正确,从而导致了错误的计算。如果参数的类型不一样,将会出现运行时错误;由于这两个参数的类型是相同的,因此没有发生运行时错误。这是个简单的错误,但却很难发现由此所导致的 bug。
在下一个过程中,您将设置断点并单步执行代码以找出错误。
试一试!
修复逻辑错误
在代码编辑器,将 MsgBox("Average speed " & GetMPH(hours, miles)) 行更改为如下所示的样子:
MsgBox("Average speed " & GetMPH(miles, hours))
单击左边空白处的红点清除断点。
按 F5 运行程序。在第一个文本框中输入 10,在第二个文本框中输入 5。然后单击“Button1”。
这次,消息框应显示正确的结果“平均速度为 30”。
看起来程序似乎已经修复了,但还存在另一个更难找到的逻辑错误。如果您希望尝试找到此错误,请使项目保持为打开状态,您将在另一个 Bug:仍然有错误这一课中再次用到项目。
后续步骤
在本课中,您学习了如何查找并修复一个逻辑错误。现在,您可以继续下一个关于如何使用注释的课程,或者试着在另一个 Bug:仍然有错误这一课中查找另一个逻辑错误。
下一课:在程序中进行注释:使用注释