javabeginner

Java Optional — Avoid NullPointerException

Use Optional to handle nullable values safely with map, flatMap, orElse, and ifPresent patterns.

java
import java.util.Optional;

public class OptionalPatterns {
    record User(String name, String email, Address address) {}
    record Address(String city, String zip) {}

    // Return Optional instead of null
    public static Optional<User> findUser(String id) {
        if ("1".equals(id)) {
            return Optional.of(new User("Alice", "alice@test.com",
                new Address("NYC", "10001")));
        }
        return Optional.empty();
    }

    public static void main(String[] args) {
        // orElse — provide default
        String name = findUser("1")
            .map(User::name)
            .orElse("Unknown");

        // orElseThrow — fail if missing
        User user = findUser("1")
            .orElseThrow(() -> new RuntimeException("User not found"));

        // ifPresent — execute if value exists
        findUser("1").ifPresent(u ->
            System.out.println("Found: " + u.name()));

        // Chained navigation (safe null traversal)
        String city = findUser("1")
            .map(User::address)
            .map(Address::city)
            .orElse("Unknown city");
        System.out.println(city); // NYC

        // filter
        Optional<User> nycUser = findUser("1")
            .filter(u -> "NYC".equals(u.address().city()));

        // or — try alternative
        User result = findUser("999")
            .or(() -> findUser("1"))
            .orElseThrow();
        System.out.println(result.name()); // Alice
    }
}

Use Cases

  • Eliminating NullPointerException in business logic
  • Safe navigation through nested object graphs
  • API design with explicit nullable return types

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.