Top Fehler von Java-Anfängern: Von A bis Z
Java ist eine mächtige, aber strenge Sprache. Anfänger stolpern oft über dieselben Hürden, die erfahrene Entwickler automatisch umgehen. In diesem Artikel analysieren wir die 10 häufigsten Fehler, die Java-Anfänger machen. Sie erfahren nicht nur, warum sie auftreten, sondern auch, wie man sie mit den richtigen Patterns und Best Practices behebt.
1. Vergessener NullPointerException (NPE)
Der häufigste Fehler in Java. Er tritt auf, wenn Sie versuchen, eine Methode aufzurufen oder auf ein Feld eines Objekts zuzugreifen, das null ist.
Problem
public class User { private String name; public int getNameLength() { return name.length(); // NPE, wenn name == null }}Lösung
Überprüfen Sie Objekte immer auf null, bevor Sie sie verwenden. Nutzen Sie Optional oder die Annotationen @Nullable / @NonNull.
public int getNameLength() { return Optional.ofNullable(name) .map(String::length) .orElse(0);}2. Ignorieren des Vertrags von equals() und hashCode()
Wenn Sie equals() überschreiben, müssen Sie auch hashCode() überschreiben. Andernfalls funktionieren Ihre Objekte in Collections wie HashSet, HashMap und anderen nicht korrekt.
Problem
public class Person { private String id; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(id, person.id); } // hashCode() wurde nicht überschrieben!}
// In HashMap landen zwei "gleiche" Objekte in verschiedenen BucketsMap<Person, String> map = new HashMap<>();map.put(new Person("1"), "Alice");System.out.println(map.get(new Person("1"))); // nullLösung
Verwenden Sie immer Objects.hash() zur Generierung des Hash-Codes:
@Overridepublic int hashCode() { return Objects.hash(id);}3. Falsche Verwendung von Generics (Raw Types)
Die Verwendung von Raw Types beraubt Sie der Typprüfung zur Kompilierzeit. Dies führt zur Laufzeit zu ClassCastException.
Problem
List list = new ArrayList(); // Raw Typelist.add("String");list.add(123); // Compiler meldet keinen Fehler
String s = (String) list.get(1); // ClassCastException!Lösung
List<String> list = new ArrayList<>();list.add("String");// list.add(123); // Compiler-Fehler — perfekt!String s = list.get(0); // sicher4. Mutation von Objekten in Collections
Das Ändern von Feldern eines Objekts, das sich bereits in einem HashSet befindet oder ein Schlüssel in einer HashMap ist, zerstört die Datenstruktur. Der Hash-Code des Objekts ändert sich, aber der Bucket bleibt derselbe.
Problem
Set<StringBuilder> set = new HashSet<>();StringBuilder sb = new StringBuilder("A");set.add(sb);sb.append("B"); // MutationSystem.out.println(set.contains(sb)); // kann false sein!Lösung
Verwenden Sie unveränderliche Objekte (String, Integer, record) als Schlüssel. Wenn Sie ein Objekt ändern müssen, entfernen Sie es aus der Collection, ändern Sie es und fügen Sie es dann wieder hinzu.
5. Falsche Ausnahmebehandlung
Zwei Extreme: Entweder Ausnahmen verschlucken (leerer catch-Block) oder zu allgemeine Ausnahmen werfen (throws Exception).
Problem
try { // gefährlicher Code} catch (Exception e) { // wir tun nichts — Fehler geht verloren}