Einleitung: Warum machen Java-Anfänger oft Fehler?
Java ist eine der beliebtesten und gefragtesten Programmiersprachen der Welt. Allerdings verwirren ihre starke Typisierung, die Fülle an Boilerplate-Code und die Besonderheiten der Speicherverwaltung oft unerfahrene Entwickler. Sogar erfahrene Programmierer machen manchmal klassische Fehler, aber für Anfänger können sie zu stundenlangem Debugging führen.
In diesem Artikel werden wir die 10 häufigsten Fehler von Java-Anfängern analysieren. Sie lernen, wie Sie diese erkennen, beheben und, was noch wichtiger ist, in Zukunft vermeiden können. Jeder Punkt wird von einem klaren Codebeispiel und einem praktischen Tipp begleitet.
1. NullPointerException (NPE) vergessen
Der berühmteste und tückischste Fehler in Java. Meistens tritt NPE auf, wenn Sie versuchen, eine Methode aufzurufen oder auf ein Feld eines Objekts zuzugreifen, das null ist.
Beispiel für den Fehler
public class Main {
public static void main(String[] args) {
String text = null;
int length = text.length(); // NullPointerException!
}
}
Wie man ihn behebt
- Überprüfen Sie Objekte immer auf
null, bevor Sie sie verwenden. - Verwenden Sie
Optionalfür Methoden, die einen leeren Wert zurückgeben könnten. - Wenden Sie die Annotationen
@Nullableund@NonNullzur Dokumentation des Codes an.
public static int getLengthSafely(String text) {
return Optional.ofNullable(text)
.map(String::length)
.orElse(0);
}
2. Strings mit == statt equals() vergleichen
Der ==-Operator vergleicht Objektreferenzen, nicht deren Inhalt. Dies ist bei Strings kritisch, da Java einen String-Pool verwendet und bei Aufruf von new String() neue Objekte erstellt.
Beispiel für den Fehler
String a = "Hallo";
String b = new String("Hallo");
System.out.println(a == b); // false! Obwohl die Strings gleich sind
Wie man ihn behebt
- Verwenden Sie immer
equals(), um den Inhalt von Strings zu vergleichen. - Verwenden Sie
equalsIgnoreCase(), um die Groß-/Kleinschreibung zu ignorieren.
System.out.println(a.equals(b)); // true
3. Ressourcen ignorieren: Kein Schließen von Verbindung, Datei oder Stream
Die Arbeit mit Dateien, Datenbanken oder Netzwerkverbindungen erfordert ein explizites Schließen der Ressourcen. Wenn Sie dies nicht tun, treten Speicherlecks und Dateisperren auf.
Beispiel für den Fehler
FileInputStream fis = new FileInputStream("datei.txt");
// Arbeiten mit der Datei
// Vergessen, fis.close(); aufzurufen
Wie man ihn behebt
Ab Java 7 verwenden Sie das try-with-resources-Konstrukt. Ressourcen werden automatisch geschlossen, auch wenn eine Ausnahme auftritt.
try (FileInputStream fis = new FileInputStream("datei.txt")) {
// Arbeiten mit der Datei
} catch (IOException e) {
e.printStackTrace();
}
4. Missverständnis der Prinzipien von equals() und hashCode()
Wenn Sie equals() überschreiben, müssen Sie auch hashCode() überschreiben. Andernfalls funktionieren Ihre Objekte in Sammlungen wie HashSet, HashMap und ähnlichen nicht korrekt.
Beispiel für den Fehler
class User {
String name;
User(String name) { this.name = name; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(name, user.name);
}
// hashCode ist nicht überschrieben!
}
Set<User> users = new HashSet<>();
users.add(new User("Alice"));
users.add(new User("Alice"));
System.out.println(users.size()); // 2, obwohl 1 erwartet wurde