Wie unterscheiden sich Syntaxfehler von Laufzeitfehlern?

4 Antworten

Compiler-Fehler: 

Das bedeutet, dass der Compiler deinen Code nicht kompilieren kann. Das liegt häufig an Syntax-Fehlern, z.B:

  • Fehlende Klammern
  • Fehlendes Semikolon
  • Zugriff auf private Eigenschaften oder Methoden aus anderen Klassen

Ein Bespiel:

int i = "10";

Das ist natürlich kein Integer, weshalb nicht kompiliert werden kann.

Compiler-Fehler sind also solche, die schon vor der Ausführung des Programms deutlich sind.

Laufzeit-Fehler:

Dabei konnte der Code kompiliert werden. Er ist also syntaktisch korrekt. Diese Fehler treten auf, während das Programm ausgeführt wird (at runtime). Bei einem runtime error wird es an einem bestimmten Punkt abgebrochen. Beispiele:

  • Division durch Null
  • NullPointerException (Eigenschaften oder Methoden einer Null-Referenz nutzen)
  • Nutzung von Array-Indizes, die außerhalb der bounds liegen
  • Nutzung nicht verfügbarer Ressourcen wie Dateien

Ein Codebeispiel:

double x = 0; // könnte z.B. eine Nutzereingabe sein
double d = 5/x;

Letztendlich fallen Compiler-Fehler schon beim kompilieren auf, d.h. der Code ist ungültig. Laufzeit-Fehler dagegen treten nicht unbedingt bei jeder Ausführung des Programms auf, sondern oft in bestimmten Situationen (ungültige Nutzereingaben, keine Internetverbindung, etc.). Deshalb ist es wichtig, diese Ausnahmen (Exceptions) per try/catch-Konstrukt abzufangen sowie zu verarbeiten.

Semantische Fehler:

Dabei ist die Syntax zwar korrekt und es treten keine runtime errors auf, doch das Programm verhält sich trotzdem nicht so wie gewünscht, weil ein Fehler in der Bedeutung (Semantik) bzw. Logik vorliegt. Hierbei ist auch entscheidend wie streng die jeweilige Programmiersprache ist, also ob sie z.B. den Vergleich eines Strings mit einem Integer erlaubt.

Typische Beispiele:

  • Falsche Bedingungen, sodass es zu Endlosschleifen kommt oder Schleifen, die zu früh abbrechen. Es kann auch passieren, dass bestimmte Blöcke gar nicht erst ausgeführt werden, weil man die Bedingung versehentlich negiert hat.
  • Fehler bei Datentypen (v.a. bei nicht-strengen Sprachen wie PHP oder JS)
  • Zuweisung (=) statt Vergleich (==)
  • Die Umsetzung des geplanten Algorithmus ist korrekt, dieser selbst jedoch nicht

Bei einem Programm gibt es drei "Zeiten":

- die Entwurfszeit (hier wird der menschenlesbare Quelltext eingegeben)

- die Kompilierzeit (hier wird aus dem Quelltext der für den Computer verständliche Maschinencode erstellt)

- die Laufzeit (Ausführungszeit - hier wird das Programm ausgeführt)

Moderne Entwicklungsumgebungen kompilieren so viel wie möglich schon "im Hintergrund", sodass Entwurfszeit und Kompilierzeit mehr und mehr verzahnen.

- Ein Syntaxfehler ist ein Fehler in der Formulierung, den man schon durch rein sprachliche Analyse entdecken kann. Z. B. unbalancierte Klammern:

x = (1 + 2;

statt

x = (1 + 2);

- Ein Kompilierzeitfehler (nach dem du nicht gefragt hattest) wird beim Versuch gefunden, den Quelltext zu übersetzen. Z. B. wenn ein Hilfsprogramm fehlt.

Syntaxfehler beziehen sich also auf die reine Form, Kompilierzeitfehler auf die Bedeutung des Quelltextes.

(Ein Zwischending sind sachen wie nicht deklarierte Variablen- oder Funktionsnamen, z. B. bei Tippfehlern.)

- Ein Laufzeitfehler tritt erst auf, während das Programm läuft. Z. B.

a = Konsoleneingabe();
b = Konsoleneingabe();
c = a / b;

und der Benutzer gibt für b 0 ein, dann kann die Division nicht durchgeführt werden. (Anm.: Allerdings kennen heutige Programmiersprachen auch die Werte Unendlich und "Keine Zahl" (NaN - "Not a Number") für Zahlenvariablen und führen die Division aus, ohne mit der Wimper zu zucken.)

Bei Syntax- und Kompilierzeitfehlern kriegt man das Programm im Gegensatz zu Laufzeitfehlern gar nicht erst ans Laufen.

- Dann gibt es noch eine ganz andere Art von Fehler, die logischen Fehler. Z. B.

wertInklMwSt = wertExklMwSt / (1 + MwStSatz/100);

statt

wertInklMwSt = wertExklMwSt * (1 + MwStSatz/100);

- einen solchen Fehler bemerkt man (außer beim sorgfältigen Durchgehen des Quelltextes) frühestens, wenn einem an den Ergebnissen irgendwas spanisch vorkommt.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Bei einem Syntaxfehler wird dein Programm erst gar nicht kompiliert, also auch nicht ausgeführt werden.

Bei einem Laufzeitfehler gerät der Programmfluss in eine Ausnahemsituation, die nicht behandelt wurde (z.B. wenn ein Objekt null ist). Dieser Fehler entsteht, wie es der Name bereits sagt, zur Laufzeit der Anwendung.

Syntaxfehler entdeckt der Compiler. Er beschreibt auch ihre Ursache. 

Syntaxfehler zu beseitigen kostet kaum Zeit.

Laufzeitfehler entdeckt man erst im Zuge von Test oder Anwendung des Programms. Ihre Ursache muss der Programmierer selbst finden (was gelegentlich recht schwierig sein kann).

Laufzeitfehler (oder gar ihre Folgen) zu beseitigen kann beliebig teuer werden.