- 1 Section
- 7 Lessons
- unbegrenzt
Typische Fehlerquellen
Fehler entstehen nicht zufällig. In fast allen Projekten tauchen ähnliche Muster immer wieder auf – egal ob Python, JavaScript oder Java.
Wer sie kennt, kann Probleme viel schneller einordnen und beheben.
1. Überblick – die fünf häufigsten Fehlerarten im Alltag
| Fehlerquelle | Beschreibung | Beispiel | Typische Debugging-Methode |
|---|---|---|---|
| 1. Falsche Bedingung | Eine if-Abfrage oder Schleifenbedingung stimmt nicht. | if score > 100: statt >= | Breakpoint vor Bedingung, Variablen prüfen |
| 2. Off-by-one-Fehler | Zählvariable läuft um 1 zu weit oder zu kurz. | Schleife for i in range(0, len(x)): → IndexError | Watch auf Zählvariable, Hit-Count-Breakpoint |
| 3. Falsche Datentypen | Zahl als String, None statt Zahl, Typkonvertierung vergessen. | "5" + 2 → TypeError | Typ prüfen, Logging mit type() |
| 4. Null-/Undefined-Zugriff | Auf ein nicht initialisiertes Objekt zugreifen. | user.name obwohl user = None | Breakpoint vor Zugriff, Call-Stack analysieren |
| 5. Seiteneffekte / Reihenfolge | Variable wird verändert, bevor sie gebraucht wird. | x = x + f(x) mit f(x) ändert x intern | Step-by-Step Debugging, Watch Expressions |
2. Falsche Bedingungen
Ein Klassiker: Eine Vergleichslogik ist minimal falsch – oft nur ein Zeichen.
points = 100
if points > 100:
print("Level up!") # passiert nie
else:
print("Bleib dabei.")
Debug-Strategie:
Breakpoint vor der Bedingung.
Watch auf
points.Prüfen, ob Grenzwert korrekt ist.
Bedingung korrigieren:
>=.
Tipp: Für Grenzwerte immer Testfälle um den Grenzwert herum schreiben (99, 100, 101).
3. Off-by-one-Fehler (Index-Fehler)
Schleifen laufen oft „einmal zu viel“ oder „einmal zu wenig“.
nums = [2,4,6,8]
for i in range(0, len(nums)): # ok
print(nums[i])
# versehentlich:
for i in range(0, len(nums)+1): # IndexError bei letztem Lauf
print(nums[i])
Debug-Strategie:
Hit-Count-Breakpoint setzen → nur beim letzten Schleifendurchlauf stoppen.
Watch auf
iundlen(nums).Schrittweise durchlaufen → Fehler tritt sichtbar beim letzten Durchlauf auf.
Merksatz:
„Der größte Index ist immer eins kleiner als die Länge.“
4. Falsche Datentypen
In dynamisch typisierten Sprachen (z. B. Python, JS) besonders häufig.
age = "20"
if age > 18: # TypeError in Python, stillschweigend falsch in JS
print("ok")
Debug-Strategie:
Logging oder Watch:
type(age)ausgeben.In Python → Fehler sofort.
In JS → explizit konvertieren:
Number(age).
Best Practice:
Eingaben immer prüfen oder casten.
5. Null / Undefined / None-Zugriffe
Ein Objekt oder Rückgabewert existiert nicht, wird aber benutzt.
user = None
print(user.name) # AttributeError
Debug-Strategie:
Breakpoint vor Zugriff.
Watch auf
user.Call-Stack prüfen: Woher kam
user =None?Schutz einbauen:
if user is not None:
print(user.name)
else:
print("Kein Benutzer vorhanden")
6. Reihenfolge / Seiteneffekte
Eine Funktion ändert unbeabsichtigt Variablen, die noch gebraucht werden.
counter = 10
def decrease(x):
global counter
counter -= 1
return x + counter
result = decrease(counter)
print(result) # schwer vorhersagbar
Debug-Strategie:
Step-by-Step-Ausführung (Step Into).
Watch auf
counter.Logpoint vor und nach Funktionsaufruf.
Funktion prüfen: Verändert sie globale Werte?
Lehre:
Keine Funktion sollte unbemerkt Zustände verändern.
Wenn doch nötig → dokumentiere es!
7. Zusammenfassung
Fehler wiederholen sich – erkenne Muster!
Bedingungen, Zählfehler, Typen, Nullwerte, Reihenfolge sind die Top 5.
Debugger hilft bei Ablauf- und Reihenfolgefehlern.
Logging / Type-Checks helfen bei Daten- und Eingabefehlern.
Jede gefundene Fehlerursache ist eine Lerngelegenheit, kein Versagen.
