Tìm Hiểu Về Null Safety Trong Kotlin | IT Life
Có thể bạn quan tâm
Board
It doesn't matter how much slowly you go as long as you don't stop
Tags
- Android1
- Design pattern1
- Java10
- Kotlin15
Archive
- July 202014
- June 20204
Recent Posts
-
So sánh Array và Collection trong Kotlin
2020-07-03
-
Tìm hiểu về scope function trong Kotlin
2020-07-03
-
Tìm hiểu về data class trong Kotlin
2020-07-03
-
Tìm hiểu về visibility modifier trong kotlin
2020-07-02
-
Tìm hiểu về lateinit và lazy trong Kotlin
2020-07-02
- Một trong những vấn đề hay gặp phải nhất với các programming language (bao gồm cả java) là sử dụng 1 null variable (reference) sẽ gây ra null reference exception.
- Trong java, bạn sẽ gặp phải NullPointerException hay NPE.
- Kotlin cung cấp các công cụ để giúp bạn loại bỏ vấn đề trên trong code.
- Do đó kotlin sẽ gặp phải NPE ở 1 trong các trường hợp sau:
- 1, Bạn trực tiếp gọi throw NullPointerException().
- 2, Sử dụng toán tử !! trên 1 null reference (mình sẽ nói sau).
- 3, Gặp vấn đề khi sử dụng platform type hoặc do java code. Ví dụ: add null element vào MutableList<String?>.
- 4, Liên quan tới việc khởi tạo của 1 object.
- Kotlin giúp chúng ta phân biệt nullable reference và non-nullable reference.
- Ví dụ 1:
123 | var a: String = "abc" // Regular initialization means non-null by defaulta = null // compilation errorval l = a.length // ok because it is safe because a isn't nullable |
- Ví dụ 2:
123 | var b: String? = "abc" // can be set nullb = null // okval l = b.length // compilation error because b is nullable |
- Cách xử lý thông thường giống với java là chúng ta sẽ check xem b có null hay không.
- Ví dụ 3: nếu b khác null thì gán l = b.length không thì l = -1
1 | val l: Int = if (b != null) b.length else -1 |
- Kotlin cung cấp 1 công cụ khác là safe call, nó thêm ?. vào sau variable.
- Ví dụ 4:
12345 | val a = "Kotlin"val b: String? = nullval l: Int? = b.length // b is nullable so l is also nullable.println(b?.length) // need safe call because b is nullableprintln(a?.length) // Unnecessary safe call because a isn't nullable |
- Safe call chain có dạng là v1?.v2?.v3[?.v4[?..]]. Nó rất hữu ích vì nó sẽ return null nếu bất cứ variable nào bị null.
- Ví dụ 5: Nếu parent, parent.child1 hay parent.child1.child2 return null, safe call chain cũng sẽ return null
1 | parent?.child1?.child2?.child3 |
- Trong phép gán =, safe call có thể được đặt bên trái của =. Nếu 1 variable trong safe call chain return null, việc gán sẽ bị bỏ qua và biểu thức bên phải = sẽ không được gọi.
- Ví dụ 6: Nếu person hay person.department trả về null, managersPool.getManager() sẽ không được gọi, do đó việc gán bị bỏ qua
1 | person?.department?.head = managersPool.getManager() |
- Kotlin cũng cung cấp 1 toán tử khác đó là evils, nó được viết là ?:.
- Nếu expression bên trái của evils khác null, kết quả của evils là expression bên trái đó. Nếu không, kết quả của evils là expression bên phải.
- Ví dụ 7: Viết lại ví dụ 3 bằng toán tử evils
1 | val l = b?.length ?: -1 |
- Trong kotlin, return và thrown cũng là các expression, do đó chúng có thể được dùng trong expression bên phải của evils.
- Ví dụ 8:
12 | val parent = node.getParent() ?: return nullval name = node.getName() ?: throw IllegalArgumentException("name expected") |
- Toán tử !! không được khuyến khích vì nó xác nhận rằng variable không thể bị null (mặc dù variable vẫn có thể bị null) và sẽ throw NPE khi variable bị null.
- Ví dụ 9: nếu b có giá trị null thì code sẽ throw NPE
1 | val l = b!!.length |
- Toán tử cast có thể gây ra ClassCastException nếu kiểu dữ liệu của variable không thuộc kiểu của class được cast.
- Kotlin cung cấp safe cast, nó được viết là as?.
- Safe cast sẽ trả về null nếu việc cast không thành công.
- Ví dụ 10: nêu cast không thành công thì i sẽ có giá trị null
1 | val i: Int? = a as? Int |
- Nếu bạn sử dụng collection cho phép các nullable element, bạn có thể lọc để chọn ra những toán tử khác null bằng filterNotNull().
- Ví dụ 11: kết quả của nonNullNumbers là [1, 2, 4]
123 | val numbers: List<Int?> = listOf(1, 2, null, 4)val nonNullNumbers = numbers.filterNotNull()println(nonNullNumbers) |
- Newer
- Older
Từ khóa » Toán Tử Elvis
-
Có Toán Tử Null Hợp Nhất (Elvis) Hoặc Toán Tử điều Hướng An Toàn ...
-
Toán Tử Elvis Trong Thymeleaf - Openplanning
-
Có Một Toán Tử Hợp Nhất Null (Elvis) Hoặc Toán Tử điều Hướng An ...
-
Phân Biệt Toán Tử ?? Và ?: Trong PHP - Viblo
-
Loại Bỏ Toán Tử Null Checks !! Trong Code Kotlin Của Bạn - Viblo
-
Làm Việc Với đối Tượng Null Và Non-null, Toán Tử Elvis Trong Kotlin
-
Toán Tử Bậc Ba Trong PHP - Viện Công Nghệ Thông Tin T3H
-
Toán Tử Giống Hệt Nhau Trong PHP Là Gì?
-
Tự Học Ngôn Ngữ Dart: Toán Tử (Operator) - 200lab Education
-
Sử Dụng Các Mẫu Kotlin Thông Dụng Trên Android
-
Kotlin Basic - My Notes
-
Làm Gì Trong Kotlin? (Nhà điều Hành Elvis) - Wake-up
-
Kotlin Bài 3: Null Safety – Kiểm Tra Biến Null An Toàn Trong Kotlin
-
Elvis Operator - Wikipedia
-
Null Safety - Kotlin
-
Đơn Giản PHP Kiểm Tra Ngay Lập Tức
-
Toán Tử Trong Ngôn Ngữ Lập Trình Swift
-
Phim Hàn đoạt Giải Cannes Và Phim Về Elvis Presley Lên Rạp Cùng ...
-
Elvis Presley - Từ Cậu Bé Nghèo đến "Ông Hoàng Nhạc Rock And Roll"