Was? Das sollte nicht passieren! Suchen von logischen Fehlern

Aktualisiert: November 2007

In dieser Lektion erfahren Sie, wie Sie logische Fehler im Programm finden.

In den vorherigen Lektionen haben Sie gelernt, wie Sie Compiler- und Laufzeitfehler finden und beheben. Die dritte Art von Programmierfehlern, logische Fehler, sind oft am schwierigsten zu entdecken. Bei logischen Fehlern erhalten Sie keine Warnungen – das Programm wird ausgeführt, liefert aber die falschen Ergebnisse. Sie müssen dann den Code nach den Gründen für das Fehlverhalten durchsuchen.

Glücklicherweise sind die Debugtools in Visual Basic dabei eine Hilfe. Zwei Debugtechniken, das Festlegen von Haltepunkten und das schrittweise Durchlaufen des Codes, helfen Ihnen durch die zeilenweise Ausführung des Codes, den Fehler aufzuspüren.

Sie können im Code-Editor auf jeder ausführbaren Codezeile einen Haltepunkt festlegen. Beim Ausführen des Programms zwingt ein Haltepunkt das Programm, anzuhalten und bei Erreichen dieser Codezeile in den Unterbechungsmodus überzugehen. Sie können dann zu diesem Zeitpunkt beliebige Informationen zum Zustand des Programms erhalten. Sie können den Wert einer Variablen überprüfen, Ausdrücke im Direktfenster testen oder mit Bearbeiten und Fortfahren Änderungen am Code vornehmen.

Wenn sich das Programm im Unterbrechungsmodus befindet, können Sie den Code zeilenweise ausführen, um die Funktion des Codes zu überprüfen. Durch Drücken der Taste F8 wird die aktuelle Codezeile ausgeführt und die Ausführung auf der nächsten Zeile angehalten. Sie können dann die Werte der Variablen überprüfen, um zu sehen, wie sie sich von einer Zeile zur nächsten ändern.

Wenn die aktuelle Codezeile eine Funktion oder eine Sub-Prozedur an anderer Stelle im Code aufruft, wird beim Drücken von F8 die Ausführung mit dieser Prozedur fortgesetzt. Nachdem Sie diese Prozedur durchlaufen haben, gelangen Sie zurück auf die Zeile hinter der Zeile, von der aus die Prozedur aufgerufen wurde. Wenn Sie eine Prozedur nicht durchlaufen möchten, können Sie UMSCHALT+F8 drücken, um die Prozedur zu überspringen.

Übung

So spüren Sie einen logischen Fehler auf

  1. Wählen Sie im Menü Datei den Befehl Neues Projekt aus.

  2. Klicken Sie im Dialogfeld Neues Projekt im Bereich Vorlagen auf Windows-Anwendung.

  3. Geben Sie LogicErrors in das Feld Name ein, und klicken Sie dann auf OK.

    Ein neues Windows Forms-Projekt wird geöffnet.

  4. Ziehen Sie von der Toolbox zwei TextBox-Steuerelemente und ein Button-Steuerelement auf das Formular.

  5. Doppelklicken Sie auf Button1, um den Code-Editor zu öffnen.

  6. Fügen Sie im Button1_Click-Ereignishandler folgenden Code hinzu:

    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))
    
  7. Fügen Sie unter der Zeile End Sub folgende Funktion ein.

    Function GetMPH(ByVal miles As Double, ByVal hours As Double) _
    As String
        GetMPH = CStr(miles / hours)
    End Function
    
  8. Drücken Sie F5, um das Programm auszuführen. Geben Sie im ersten Textfeld 10 (für 10 Minuten) und im zweiten Textfeld 5 (um 5 Meilen darzustellen) ein, und klicken Sie dann auf Button1.

    Ein Meldungsfeld mit der Meldung "Average speed 0.03333334" wird angezeigt. Wenn Sie aber 5 Meilen in 10 Minuten durchfahren, wäre die richtige Antwort 30 mph.

    Lassen Sie das Projekt geöffnet. In der nächsten Prozedur wird demonstriert, wie Sie den logischen Fehler finden.

Suchen von logischen Fehlern

Im letzten Beispiel enthält die Programmlogik offensichtlich einen Fehler. Entsprechend dem Ergebnis reisen Sie mit weniger als einer Meile pro Stunde und nicht wie erwartet mit 30 Meilen pro Stunde. Aber wo liegt der Fehler?

In der nächsten Prozedur setzen Sie einen Haltepunkt und durchlaufen den Code schrittweise, um den Fehler zu finden.

Übung

So legen Sie einen Haltepunkt fest und durchlaufen den Code schrittweise

  1. Suchen Sie im Code-Editor nach der Zeile hours = minutes / 60, und klicken Sie dann neben dieser Codezeile auf den linken Rand.

    Zur Darstellung des Haltepunkts wird am Rand ein roter Punkt angezeigt, und der Code wird rot hervorgehoben.

  2. Drücken Sie F5, um das Programm erneut auszuführen. Geben Sie im ersten Textfeld 10 ein, und geben Sie im zweiten Textfeld 5 ein. Klicken Sie dann auf Button1.

    Das Programm wird angehalten, wenn es den Haltepunkt erreicht. Die Zeile hours = minutes / 60 ist gelb hervorgehoben.

    Überprüfen Sie die Werte der Variablen, indem Sie mit dem Mauszeiger auf die Variablen zeigen. Der Wert von hours sollte 0 betragen und der Wert von minutes10.

  3. Drücken Sie F8, um die Zeile hours = minutes / 60 auszuführen und zur nächsten Zeile überzugehen.

    Überprüfen Sie die Werte der Variablen in der Zeile MsgBox("Average speed " & GetMPH(hours, miles)). Der Wert von hours sollte jetzt 0.166666672 betragen, und der Wert von miles sollte 5.0 betragen.

  4. Drücken Sie nochmals F8, um die aktuelle Zeile auszuführen.

    Beachten Sie, dass die Ausführung mit der Zeile Function GetMPH fortfährt.

    Überprüfen Sie die Werte der Variablen in dieser Zeile. Sie werden bemerken, dass der Wert von miles jetzt 0.166666672 beträgt und der Wert von hours5.0 – d. h. eine genaue Umkehrung zur vorherigen Zeile. Damit haben Sie den Fehler gefunden.

    Lassen Sie das Projekt geöffnet. In der nächsten Prozedur wird veranschaulicht, wie Sie den logischen Fehler beheben.

Beheben von logischen Fehlern

In der vorherigen Prozedur wurden die Werte der Variablen miles und hours durch den jeweils anderen Wert ersetzt. Können Sie die Ursache erkennen?

Wenn Sie die Zeile MsgBox("Average speed " & GetMPH(hours, miles)) betrachten, werden Sie feststellen, dass an die GetMPH-Funktion zwei Argumente übergeben werden, hours und miles, und zwar in dieser Reihenfolge. Ein Blick auf die Funktionsdeklaration Function GetMPH(ByVal miles As Double, ByVal hours As Double)... verrät Ihnen, dass das Argument miles als erstes und hours als zweites aufgeführt wird.

Ein Fehler in der Logik ist aufgetreten, weil die Argumente in der falschen Reihenfolge übergeben wurden. Dies führte zu einer fehlerhaften Berechnung. Bei unterschiedlichen Argumenttypen wäre ein Laufzeitfehler aufgetreten. Da beide Argumente vom selben Typ waren, war dies nicht der Fall. Es war ein einfacher Fehler, das sich daraus ergebende Problem war aber schwer zu finden.

In der nächsten Prozedur setzen Sie einen Haltepunkt und durchlaufen den Code schrittweise, um den Fehler zu finden.

Übung

So beheben Sie den logischen Fehler

  1. Ändern Sie im Code-Editor die Zeile MsgBox("Average speed " & GetMPH(hours, miles)) folgendermaßen:

    MsgBox("Average speed " & GetMPH(miles, hours))
    
  2. Löschen Sie den Haltepunkt, indem Sie auf den roten Punkt am linken Rand klicken.

  3. Drücken Sie F5, um das Programm auszuführen. Geben Sie im ersten Textfeld 10 ein, und geben Sie im zweiten Textfeld 5 ein. Klicken Sie dann auf Button1.

    Dieses Mal sollte im Meldungsfeld das richtige Ergebnis angezeigt werden: "Average speed 30".

    Das Programm scheint jetzt repariert zu sein, aber es enthält einen noch schwerer zu findenden logischen Fehler. Wenn Sie versuchen möchten, diesen zu finden, können Sie das Projekt geöffnet lassen. Sie werden es in der Lektion Immer noch ein Fehler: Etwas stimmt noch nicht ganz wieder verwenden.

Nächste Schritte

In dieser Lektion haben Sie gelernt, wie Sie einen logischen Fehler finden und beheben. Sie können an dieser Stelle mit der nächsten Lektion zur Verwendung von Kommentaren fortfahren, oder Sie versuchen in der Lektion Immer noch ein Fehler: Etwas stimmt noch nicht ganz, einen weiteren logischen Fehler zu finden.

Nächste Lektion: Notizen in eigenen Programmen: Verwenden von Kommentaren

Siehe auch

Aufgaben

Es funktioniert nicht! Suchen und Ausschließen von Laufzeitfehlern

Erkennen von Fehlern: Drei Arten von Programmierfehlern

Suchen von Fehlern: Einführung in das Debuggen in Visual Basic