追蹤並修正邏輯錯誤:尋找邏輯錯誤
更新:2007 年 11 月
在本課程中,您將學習如何在您的程式中尋找邏輯錯誤。
在上一個課程中,您已經學會如何尋找並修復編譯器錯誤和執行階段錯誤。第三類程式設計錯誤 ─ 邏輯錯誤,可能是最難發現的錯誤。發生邏輯錯誤時,您完全不會接到警告,因為程式仍然會執行,只是結果不正確而已。然後,您就必須讀完整個程式碼,以判斷發生問題的原因。
所幸,Visual Basic 中的偵錯工具能提供協助。兩項偵錯技巧:設定「中斷點」(Breakpoint) 和「逐步」(Stepping) 偵錯程式碼,可協助您在執行時一次檢查一行程式碼,以尋找錯誤。
您可以在 [程式碼編輯器] 中針對任何可執行的程式碼行設定中斷點。執行程式時,如果到達此程式碼行,中斷點就會強制程式停止並進入中斷模式。然後,您就可以取得該時間點程式狀態的任何相關資訊。您可以檢查任何變數的值、在 [即時運算] 視窗中測試運算式,或是使用 [編輯後繼續] 功能變更您的程式碼。
進入中斷模式之後,您也可以逐步執行程式碼,一次執行一行,以便仔細看清楚程式碼如何運作。按下 F8 鍵,可以讓目前這行程式碼程執行,然後在下一行停止。如此您就可以檢查變數的值,查看這些變數從上一行到下一行的變更方式。
如果目前的程式碼行呼叫程式碼中他處的函式或 Sub 程序,在您按下 F8 時,執行作業就會逐步執行該程序。一旦您已逐步執行該程序,您就會被傳送至呼叫程序那一行後面的程式碼行。如果您不要逐步執行程序,可以按 SHIFT+F8,跳過該程序。
試試看!
若要觀察邏輯錯誤
在 [檔案] 功能表上,選擇 [新增專案]。
在 [新增專案] 對話方塊的 [範本] 窗格中,按一下 [Windows 應用程式]。
在 [名稱] 方塊中,輸入 LogicErrors,再按 [確定]。
會開啟新的 Windows Form 專案。
按兩下 [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]。
訊息方塊隨即顯示,其中包含訊息「平均速度 0.03333334」。不過,如果您在十分鐘內移動五英里,正確的答案會是 30 mph。
讓專案保持開啟狀態,因為在下一個程序中,您將學習如何尋找邏輯錯誤。
尋找邏輯錯誤
在上一個範例中,程式邏輯顯然是有些不對勁。根據這個結果,您是以每小時不到一哩的速度前進,不是您所預期的每小時三十哩,但是錯誤出在哪裡?
在下一個程序中,您將設定中斷點,並逐步執行程式碼,以找出錯誤。
試試看!
若要設定中斷點並逐步執行程式碼
在 [程式碼編輯器] 中,找出程式碼行 hours = minutes / 60,然後按一下該程式碼行的左邊界。
邊界中應該會出現紅點,而程式碼應該會以紅色反白顯示,代表中斷點。
按下 F5 再次執行程式。在第一個文字方塊中,輸入 10 並在第二個文字方塊中,輸入 5。然後按一下 [Button1]。
程式會在到達中斷點時停止。這行程式碼 hours = minutes / 60 會以黃色反白顯示。
在變數之上按住滑鼠檢查變數值:hours 的值應該是 0,而 minutes 的值應該是 10。
按下 F8 執行程式碼行 hours = minutes / 60,然後逐步執行下一行。
檢查 MsgBox("Average speed " & GetMPH(hours, miles)) 行上的變數值:hours 的值現在應該是 0.166666672,而 miles 的值應該是 5.0。
再次按下 F8,執行目前的程式碼行。
請注意,執行作業會逐步進行至程式碼行 Function GetMPH。
檢查這一行上的變數值:您應該會看到 miles 的值現在是 0.166666672,而 hours 的值現在是 5.0,剛好是上一行的相反。您已經找到錯誤了。
讓專案保持開啟狀態,因為在下一個程序中,您將學習如何修正邏輯錯誤。
修正邏輯錯誤
在前面的程序中,變數 miles 和 hours 的值互相對調。您找出原因了嗎?
如果您仔細看程式碼行 MsgBox("Average speed " & GetMPH(hours, miles)),就會看到傳送了兩個引數給 GetMPH 函式,hours 和 miles,依此順序傳送。如果仔細看函式宣告 Function GetMPH(ByVal miles As Double, ByVal hours As Double)...,您會注意到引數列出順序是:miles 第一而 hours 第二。
發生邏輯錯誤是因為引數的傳遞順序錯誤,導致計算不正確。如果引數是不同類型,可能就會看到執行階段錯誤,但是因為引數是相同類型,所以未發生執行階段錯誤。它是簡單的錯誤,但結果所產生的錯誤卻很難尋找。
在下一個程序中,您將設定中斷點,並逐步執行程式碼,以找出錯誤。
試試看!
若要修正邏輯錯誤
在 [程式碼編輯器] 中,將程式碼行 MsgBox("Average speed " & GetMPH(hours, miles)) 變更如下所示的樣子:
MsgBox("Average speed " & GetMPH(miles, hours))
按一下左邊界中的紅點,清除中斷點。
請按 F5 執行程式。在第一個文字方塊中,輸入 10 並在第二個文字方塊中,輸入 5。然後按一下 [Button1]。
這次訊息方塊應該會顯示正確的結果 "Average speed 30"。
現在看起來好像程式已經修正,但是還有另外一個更難找出的邏輯錯誤。如果您要嘗試找出這個錯誤,請讓專案保持開啟,您將在其他錯誤:仍然有地方發生錯誤課程中使用它。
後續步驟
在本課程中,您學會如何尋找並修正邏輯錯誤。現在您可以繼續進行下一個關於使用註解的課程,或者也可以在其他錯誤:仍然有地方發生錯誤課程中試試身手,尋找另一個邏輯錯誤。
下一個課程:建立程式說明:使用註解