In Programmiesprachen wie Java unterscheiden wir verschiedene Fehlertypen. Die "einfachsten" und "harmlosesten" Fehler sind die lexikalischen Fehler. Etwas gravierende sind syntaktische Fehler, noch schlimmer aber sind semantische und logische Fehler.
Lexikalische Fehler
Das sind quasi Rechtschreibfehler. Hier ein Beispiel:
pablic woid bewegen()
In dieser Zeile finden sich zwei lexikalische Fehler. Das Wort "public" ist falsch geschrieben, und das Wort "void" ebenfalls. Lexikalische Fehler entstehen, wenn man zu schnell tippt, nicht richtig aufpasst, Fehler beim Kopieren udn Einfügen macht und aus vielen anderen Gründen. Der Compiler erkennt aber solche lexikalischen Fehler und zeigt dann eine entsprechende Fehlermeldung an.
Syntaktische Fehler
Das sind sozusagen die Grammatikfehler in der Programmiersprache. Auch hier ein Beispiel:
public bewegen() void
Lexikalische Fehler treten hier nicht auf, alle drei Wörter sind korrekt geschrieben. Aber die Reihenfolge der Begriffe ist falsch. Zuerst kommt immer das Wort "public" (oder alternativ "private"), dann der Datentyp und erst am Ende der Bezeichner der Methode. Der Compiler erkennt auch solche Fehler und macht entsprechende Meldungen.
Semantische Fehler
Auch semantische Fehler sind im Prinzip Grammatikfehler, aber etwas gravierender als syntaktische und schwerer zu entdecken. Hier wieder ein Beispiel:
umfang = 2 * pi * radius;
An dieser Java-Anweisung ist alles korrekt, sowohl lexikalisch wie auch syntaktisch. Trotzdem ist ein semantischer Fehler aufgetreten, denn in dem Quelltext wurde die Variable "umfang" an keiner Stelle deklariert, was man an dieser einen Zeile natürlich nicht sieht. Der Compiler macht hier eine entsprechende Fehlermeldung.
Logische Fehler
Diese Fehler sind am schwersten zu entdecken, auch der Compiler ist dazu nicht in der Lage. Hier ein Beispiel:
umfang = 3 * pi * radius;
Alles ist korrekt, alle Variablen wurden deklariert, es liegt kein lexikalischer, syntaktischer oder semantischer Fehler vor. Und trotzdem ist die Berechnung falsch, die Zahl 3 muss durch 2 ersetzt werden.
Noch ein Beispiel:
public double umfang(double radius) { return pi * radius * radius; }
Alles an dieser sondierenden Methode (keine get-Methode!) ist korrekt, allerdings berechnet sie nicht den Umfang eines Kreises, sondern den Flächeninhalt.
Andere Fehlertypen
Es gibt weitere Fehler beim Programmieren, die sich jetzt aber schlechter klassifizieren lassen. Betrachten wir das folgende lexikalisch, syntaktisch und semantisch korrekte Beispiel:
public void dieseMethodeWirdImmerDannAufgerufenWirdWennEineZahlEingegebenWurde()
Was halten Sie von diesem langen Bezeichner? Kein Fehler im eigentlichen Sinne, trotzdem völlig unsinnig, weil viel zu lang. Noch schlimmer ist das folgende Beispiel:
public void asdfkjdadfgisdasdkladsfghjasdzuiw4rasdzerfthdf()
Da hat sich wohl jemand gedacht, "ich tarne meine Methodennamen, damit kein Fremder durch meinen Programmcode durchsteigt". Teilweise wird das in der Softwareentwicklung sogar gemacht, aber erst dann, wenn das Programm komplett fertig ist und verkauft werden soll. Mit einer Suchen/Ersetzen-Funktion kann man dann alle Bezeichner unkenntlich machen, das Programm läuft aber trotzdem korrekt.