Die häufigsten Fehler von Java-Anfängern: von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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"))); // null


Lö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); // sicher


4. 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}

Blogs

Buchempfehlungen