Bỏ qua để đến nội dung

NullPointerException

NullPointerException (thường viết tắt NPE) là lỗi runtime phổ biến nhất trong Java - xảy ra khi bạn cố gắng dùng một tham chiếu null như thể nó trỏ đến một đối tượng thật sự:

String name = null;
System.out.println(name.length()); // NullPointerException! name không trỏ đến đối tượng nào
public class Person {
String name;
}
Person person = new Person(); // person.name mặc định là null (chưa gán)
System.out.println(person.name.toUpperCase()); // NullPointerException!
  • null là giá trị mặc định hợp lệ cho mọi kiểu tham chiếu (object) - trình biên dịch không ngăn bạn gán null hay truyền null vào nơi cần đối tượng thật
  • Lỗi chỉ xuất hiện lúc chạy chương trình, thường ở một dòng xa nơi null thực sự được tạo ra, gây khó truy vết
  • Rất dễ xảy ra với kết quả trả về từ Map.get() (trả null nếu không tìm thấy khóa), hoặc dữ liệu chưa khởi tạo
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> ages = new HashMap<>();
int age = ages.get("An"); // "An" không có trong map -> get() trả về null
// NullPointerException khi unbox null Integer thành int!

1. Kiểm tra null trước khi dùng:

String name = getName(); // giả sử có thể trả về null
if (name != null) {
System.out.println(name.length());
}

2. Dùng Objects.requireNonNull() để báo lỗi rõ ràng, sớm hơn:

import java.util.Objects;
public Person(String name) {
this.name = Objects.requireNonNull(name, "name không được null");
}

3. Dùng Optional (Java 8+) để biểu thị rõ ràng “có thể không có giá trị”:

import java.util.Optional;
Optional<String> maybeName = Optional.ofNullable(getName());
String result = maybeName.orElse("Không rõ tên"); // giá trị mặc định nếu là null

4. Dùng getOrDefault() thay vì get() với Map:

int age = ages.getOrDefault("An", 0); // trả về 0 nếu "An" không tồn tại, thay vì null

NullPointerException: xảy ra khi gọi phương thức/truy cập field trên một tham chiếu null.

  • Luôn kiểm tra null trước khi dùng dữ liệu có thể chưa được khởi tạo
  • Cẩn thận với kết quả từ Map.get() và autoboxing (Integer null không unbox được thành int)
  • Cân nhắc dùng Optional hoặc Objects.requireNonNull() để xử lý rõ ràng, sớm hơn