Wie man aufhört, null in Java zu prüfen, ohne verrückt zu werden

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

Der Fluch von null: Warum schreiben wir immer wieder dasselbe?

\n\n

Wenn Sie länger als eine Woche in Java programmieren, sind Sie mit Sicherheit schon auf NullPointerException gestoßen. Und höchstwahrscheinlich war Ihre erste Reaktion: „Aha, ich muss es einfach prüfen!“. So entstehen kilometerlange Codezeilen wie diese:

\n\n
if (user != null) {\n    if (user.getAddress() != null) {\n        String city = user.getAddress().getCity();\n        if (city != null) {\n            System.out.println(city.toUpperCase());\n        }\n    }\n}\n
\n\n

Dieser Code funktioniert. Aber er ist hässlich. Er verwandelt das Lesen der Logik in eine Qual und die Wartung in einen Albtraum. Die Frage „How do I avoid checking for nulls in Java?“ auf Stack Overflow hat nicht umsonst Tausende von Aufrufen gesammelt. Jeder Java-Entwickler stellt sie sich früher oder später.

\n\n

Die gute Nachricht: Null-Prüfungen zu vermeiden ist nicht nur möglich, sondern auch notwendig. Java ist nicht JavaScript, und wir haben die Werkzeuge, um sauberen, sicheren Code ohne „schützende“ Konstrukte zu schreiben. Lassen Sie uns sie alle durchgehen – vom grundlegenden Handwerkszeug bis zu fortgeschrittenen Techniken.

\n\n

1. Optional<T> – Ihr wichtigster Verbündeter

\n\n

Seit Java 8 haben wir Optional. Es ist ein Container, der einen Wert enthalten oder leer sein kann. Es wurde buchstäblich entwickelt, um Null-Prüfungen zu vermeiden und Code deklarativer zu gestalten.

\n\n

Wie funktioniert es?

\n\n

Anstatt null aus einer Methode zurückzugeben, geben Sie Optional zurück. Und anstelle von Prüfungen verwenden Sie Methodenketten.

\n\n
// Schlecht\npublic String getCity(User user) {\n    if (user == null) return "Unknown";\n    Address address = user.getAddress();\n    if (address == null) return "Unknown";\n    return address.getCity();\n}\n\n// Gut\npublic Optional<String> getCity(User user) {\n    return Optional.ofNullable(user)\n            .map(User::getAddress)\n            .map(Address::getCity);\n}\n\n// Verwendung\nString city = getCity(someUser).orElse("Unknown");\n
\n\n

Beachten Sie: kein einziges if. map funktioniert nur, wenn der Wert nicht null ist. Wenn auf irgendeiner Stufe null auftritt – wird die Kette unterbrochen und Sie erhalten Optional.empty().

\n\n

Beliebte Methoden von Optional

\n\n
    \n
  • orElse(T other) – Wert oder Ersatzwert zurückgeben
  • \n
  • orElseGet(Supplier<? extends T> other) – faule Version, wird nur bei Bedarf ausgewertet
  • \n
  • orElseThrow(Supplier<? extends X> exceptionSupplier) – eigene Ausnahme werfen
  • \n
  • ifPresent(Consumer<? super T> consumer) – Aktion ausführen, wenn Wert vorhanden
  • \n
  • filter(Predicate<? super T> predicate) – nach Bedingung filtern
  • \n
\n\n
// Beispiel mit Filter\nOptional<String> name = Optional.of("Java");\nname.filter(n -> n.startsWith("J"))\n    .ifPresent(System.out::println); // Gibt "Java" aus\n
\n\n

Wichtig: Optional ist für Rückgabewerte gedacht, nicht für Klassenfelder oder Methodenparameter. Verwenden Sie es nicht übermäßig.

\n\n

2. Objects.requireNonNull() – Hilfsmittel für explizite Verträge

\n\n

Manchmal ist null ein Fehler, der so früh wie möglich erkannt werden muss. Anstatt Prüfungen manuell zu schreiben, verwenden Sie java.util.Objects.requireNonNull().

\n\n
public class UserService {\n    private final UserRepository repository;\n\n    public UserService(UserRepository repository) {\n        this.repository = Objects.requireNonNull(repository, \n            "UserRepository must not be null");\n    }\n\n    public User findById(Long id) {\n        Objects.requireNonNull(id, "ID must not be null");\n        return repository.findById(id);\n    }\n}\n
\n\n

Dieser Ansatz nennt

Blogs

Buchempfehlungen