VieTopik
Tiếng HànTiếng Anh.NET (C#)Java
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Java CoreClass cơ bản
Bài 13/19
5 phút

null và Optional

Nội dung bài · 6 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Optional
  4. 4.Thử ngay
  5. 5.Lỗi hay gặp
  6. 6.Tóm tắt

Bạn tìm khách hàng theo số điện thoại, nhưng chưa có khách nào dùng số đó nên kết quả là không có ai. Java dùng null để diễn tả "không có gì", và null cũng là nguồn gây lỗi phổ biến nhất khi chương trình chạy.

Khái niệm

🕳️ null: giá trị cho biết biến không trỏ tới object nào.

❓ Optional: class bọc một giá trị có thể có hoặc không, như Optional<Customer>, cho nơi gọi biết kết quả có thể rỗng.

Biến kiểu tham chiếu nào cũng nhận được null. Kiểu nguyên thuỷ như int thì không, muốn "chưa biết" phải dùng class bọc Integer.

Ví dụ

// Main.java
void main() {
    Customer found = findByPhone("0900000000");

    if (found != null) {
        System.out.println(found.getName());
    } else {
        System.out.println("Không tìm thấy");
    }
}

Customer findByPhone(String phone) {
    return null;   // giả sử không có ai
}

// Customer.java
class Customer {
    private String name = "";

    public String getName() { return name; }
}
  • Kiểu Customer không cho người đọc biết kết quả có thể là null. Phải đọc code của findByPhone mới biết.
  • Luôn kiểm tra != null trước khi dùng một biến có thể là null.
  • Compiler không cảnh báo khi bạn dùng biến null mà chưa kiểm tra. Lỗi chỉ lộ ra lúc chạy.

Optional

Optional ghi rõ "có thể không có" ngay trong kiểu, và cho sẵn giá trị thay thế:

// Main.java
void main() {
    Optional<String> note = Optional.empty();
    Optional<Integer> discount = Optional.empty();

    int length = note.orElse("").length();
    int percent = discount.orElse(0);

    System.out.println(length);    // 0
    System.out.println(percent);   // 0
}
  • Optional.empty(): không có giá trị. Optional.of(x): có giá trị x.
  • Optional.ofNullable(x): rỗng nếu x là null, có giá trị nếu không.
  • o.orElse(b): nếu o rỗng thì lấy b.
  • Method tìm kiếm nên trả về Optional<Customer> thay cho null, để nơi gọi thấy ngay phải xử lý trường hợp không tìm thấy.

Thử ngay

Dán vào Main.java rồi chạy java Main.java:

// Main.java
void main() {
    String coupon = null;
    System.out.println(Optional.ofNullable(coupon)
            .orElse("Không có mã"));

    coupon = "sale10";
    System.out.println(Optional.ofNullable(coupon)
            .orElse("Không có mã"));
}

Đoán trước khi chạy: lần in đầu tiên có bị lỗi vì coupon đang là null không?

Xem kết quả
Không có mã
sale10

Không lỗi. ofNullable thấy coupon là null nên tạo Optional rỗng, rồi orElse thay bằng "Không có mã".

Lỗi hay gặp

Dùng biến null mà không kiểm tra. Chương trình dừng với NullPointerException.

// SAI — lỗi khi chạy: note đang là null
String note = null;
System.out.println(note.length());
// ĐÚNG
String note = null;
System.out.println(
        Optional.ofNullable(note).orElse("").length());

Gán null cho kiểu nguyên thuỷ. int luôn phải có một con số.

// SAI — lỗi compile: int không nhận null
int stock = null;
// ĐÚNG — Integer cho phép "chưa biết"
Integer stock = null;

Tóm tắt

  • null nghĩa là không trỏ tới object nào.
  • Kiểu tham chiếu nhận được null, kiểu nguyên thuỷ thì không (dùng Integer thay int).
  • Kiểm tra != null trước khi dùng, hoặc bọc bằng Optional rồi orElse.
  • Gọi method trên null gây NullPointerException.

Tự kiểm tra

0/3 câu
Câu 1

Optional<Integer> points = Optional.empty(); int total = points.orElse(10); Giá trị của total là gì?

Câu 2

Chương trình dừng với NullPointerException ở dòng customer.getName().toUpperCase(). Nguyên nhân nhiều khả năng nhất là gì?

Câu 3

Khai báo nào hợp lệ?

Kiểu nguyên thuỷ và kiểu tham chiếustatic

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Optional
  4. 4.Thử ngay
  5. 5.Lỗi hay gặp
  6. 6.Tóm tắt