Tony Hoare - người khởi tạo ý tưởng về Null, gọi nó là "sai lầm tỷ đô". Null là một trong những điểm mà bạn dễ bị lỗi nhất khi code Java.
Nếu bạn nhìn vào trình quản lý bug của mình, tôi chắc chắn rằng trên 90% lỗi bạn thấy là NullPointerException.
Nhờ vào Kotlin, bạn sẽ làm việc trong môi trường an toàn hơn (thậm chí với cả các thư viện Java), nó sẽ giảm thiểu được những vẫn đề này.

1. Null trong Kotlin

Null trong Kotlin không tồn tại trừ khi bạn nói khác, nghĩa là không có biến, theo mặc định được set là null. Hãy nhớ rằng trong Kotlin, tất cả đều là đối tượng.
Vì vậy, nó không được compile:

val x: Int = null

Nếu bạn muốn biến có thể null thì bạn cần thêm dấu ? vào sau kiểu giá trị của biến.

val x: Int? = null

2. Kiểm tra thời gian Compile

Khi compile thì trình biên dịch sẽ buộc bạn phải kiểm tra null trước khi thao tác với biến. Điều này đảm bảo NullPointerException không xảy ra.
Ví dụ:

val y = x.toDouble()

Nó sẽ không compile nếu bạn không check null trước đó:

if (x != null) {
    val y = x.toDouble()
}

3. Biểu thức truy cập an toàn

Có một cách dễ hơn trong ví dụ trên đó là sử dụng ? ngay trước . khi thực hiện gọi hàm.
Nếu biến không phải null thì nó thực hiện thao tác, Nếu không nó sẽ không làm bất cứ điều gì:

val y = x?.toDouble()

Trong trường hợp này, nếu x null thì biểu thức sẽ trả về null, bởi vậy, y sẽ có kiểu Double?

4. Toán tử Elvis

Nếu như chúng ta không muốn có một kết quả Null như là kết quả của toán tử ? thì toán tử (?:) cho phép chúng ta trả về một giá trị trong trường hợp đó:

val y = x?.toDouble() ?: 0.0

Đoạn mã trên tương đương với:

val y = if (x != null) {
    x.toDouble()
} else {
    0.0
}

Như bạn thấy, hầu hết các câu trong Kotlin đều là các biểu thức. Như ví dụ trên bạn có thể gán kết quả vào biến.

5. Tránh việc kiểm tra Null

Toán tử (!!) sẽ tránh được sự cần thiết phải kiểm tra Null nếu bạn chắc chắn biến sẽ không bao giờ trở thành null.
Theo tôi, có rất ít trường hợp mà toán tử được sử dụng trong khi code. Hầu như sẽ có các giải pháp tốt hơn.
Bạn có thể làm như sau:

val x: Int? = null
val y = x!!.toDouble()

Nó sẽ được biên dịch và tạo ra một NullPointerException.
Vì vậy bạn hãy cẩn thận với toán tử này.

6. Hỗ trợ Java

Khi làm việc với các thư viện Java, chúng ta có thể thấy rằng chúng ta sẽ phải đối mặt với các tình huống khác nhau liên quan đến việc kiểm tra null.

  • Thư viện được chú thích đúng cách:
    Nếu các chú thích @Nullable@NotNull đang được sử dụng đúng thì cả Java và Kotlin sẽ làm việc trơn chu hơn và họ sẽ tìm được biến khi nào null, khi nào không.
    Nhiều phần trong Android Framework đã được chú thích chính xác, vì vậy đây là một lợi thế rất lớn để làm việc với Kotlin.
  • Thư viện không có chú thích
    Nếu thư viện không có chú thích thì nó sẽ được đánh dấu bằng một toán tử đặc biệt (!), chúng ta sẽ quyết định nếu tham số hay giá trị trả về có được phép null hay không.

7. Kết luận

NullPointerException là cơn ác mộng cho tất cả các nhà phát triển Java, và chắc chắn nó có trong hầu hết các lỗi xảy ra của bạn.
Giảm số lượng code trong Kotlin là rất dễ dàng, ngay cả khi làm việc với các thư viện hay các framework trong Java.
Chỉ có điều này giúp bạn tránh mất hàng giờ liền ngồi debug những lỗi không cần thiết, và nó sẽ làm cho code ổn định hơn nhiều.