NPE xảy ra khi gọi method/truy cập field/unbox primitive trên reference null.
Tony Hoare gọi null là "lỗi tỷ đô" của mình.
String s = null;
s.length(); // NPE
Map<String, Integer> m = Map.of("a", 1);
int x = m.get("b"); // NPE — unbox Integer null thành intPhòng tránh, theo độ ưu tiên:
1. Thiết kế không nhận/trả null: dùng Optional<T>, list rỗng List.of(), hoặc throw exception. Cách bền nhất.
2. Objects.requireNonNull(arg) ở đầu constructor/method → fail-fast ngay tại biên giới.
3. Optional<T> cho return type — không dùng làm field/parameter.
4. JDK 14+ "Helpful NPE": message chỉ rõ biến nào null (mặc định bật từ JDK 15).
5. @NonNull/@Nullable (JSpecify, Checker Framework): IDE cảnh báo lúc edit.
6. Pattern matching instanceof (Java 16+): auto null-check + cast.
Tránh:
- map.get() rồi dùng ngay mà không check.
- Optional.get() không check isPresent() — chỉ đổi NPE thành NoSuchElementException.
Tóm lại: đừng rải if (x != null) khắp nơi — thiết kế contract để null không đi vào hệ thống ngay từ đầu.