1. Sebelum memulai
Codelab ini mengajarkan tentang nullability dan pentingnya keamanan null
. Nullability adalah konsep yang umumnya ditemukan dalam banyak bahasa pemrograman. Hal ini mengacu pada kemampuan variabel untuk tidak memiliki nilai. Di Kotlin, perlakuan pada nullability sengaja diatur untuk mencapai keamanan null
.
Prasyarat
- Pengetahuan tentang dasar-dasar pemrograman Kotlin, termasuk variabel, yang mengakses metode dan properti dari variabel, serta fungsi
println()
danmain()
- Pemahaman tentang kondisional Kotlin, termasuk pernyataan
if/else
dan ekspresi Boolean
Yang akan Anda pelajari
- Pengertian
null
. - Perbedaan antara jenis nullable dan non-nullable
- Pengertian keamanan
null
, nilai pentingnya, dan cara Kotlin mencapai keamanannull
. - Cara mengakses metode dan properti variabel nullable dengan operator panggilan aman
?.
dan operator pernyataan non-null!!
. - Cara melakukan pemeriksaan
null
dengan kondisiif/else
. - Cara mengonversi variabel nullable menjadi jenis non-nullable dengan ekspresi
if/else
. - Cara memberikan nilai default saat variabel nullable adalah
null
dengan ekspresiif/else
atau operator Elvis?:
.
Yang akan Anda butuhkan
- Browser web dengan akses ke Kotlin Playground
2. Menggunakan variabel nullable
Apa itu null
?
Di Unit 1, Anda telah mempelajari bahwa saat mendeklarasikan variabel, Anda harus segera menetapkan nilainya. Misalnya, saat mendeklarasikan variabel favoriteActor
, Anda dapat langsung menetapkan nilai string "Sandra Oh"
padanya.
val favoriteActor = "Sandra Oh"
Namun, bagaimana jika Anda tidak memiliki aktor favorit? Anda mungkin ingin menetapkan nilai "Nobody"
atau "None"
ke variabel. Ini bukan pendekatan yang baik karena program Anda menafsirkan variabel favoriteActor
memiliki nilai "Nobody"
atau "None"
, dan bukan tidak ada nilai sama sekali. Di Kotlin, Anda dapat menggunakan null
untuk menunjukkan bahwa tidak ada nilai yang terkait dengan variabel.
Untuk menggunakan null
dalam kode, ikuti langkah-langkah berikut:
- Di Kotlin Playground, ganti konten di bagian isi fungsi
main()
dengan variabelfavoriteActor
yang ditetapkan kenull
:
fun main() {
val favoriteActor = null
}
- Cetak nilai variabel
favoriteActor
dengan fungsiprintln()
, lalu jalankan program ini:
fun main() {
val favoriteActor = null
println(favoriteActor)
}
Outputnya akan terlihat seperti cuplikan kode ini:
null
Penetapan ulang variabel dengan null
Sebelumnya, Anda sudah mempelajari bahwa Anda dapat menetapkan ulang variabel yang ditentukan dengan kata kunci var
ke nilai yang berbeda dari jenis yang sama. Misalnya, Anda dapat menetapkan ulang variabel name
yang dideklarasikan dengan satu nama ke nama lain selama nama baru berjenis String
.
var favoriteActor: String = "Sandra Oh"
favoriteActor = "Meryl Streep"
Setelah mendeklarasikan variabel, ada kalanya Anda ingin menetapkan variabel ke null
. Misalnya, setelah menyatakan aktor favorit Anda, Anda memutuskan bahwa Anda tidak ingin mengungkapkan aktor favorit Anda sama sekali. Dalam hal ini, sebaiknya tetapkan variabel favoriteActor
ke null
.
Memahami variabel non-nullable dan nullable
Untuk menetapkan ulang variabel favoriteActor
ke null
, ikuti langkah-langkah berikut:
- Ubah kata kunci
val
menjadi kata kuncivar
, lalu tentukan bahwa variabelfavoriteActor
adalah jenisString
dan tetapkan ke nama aktor favorit Anda:
fun main() {
var favoriteActor: String = "Sandra Oh"
println(favoriteActor)
}
- Hapus fungsi
println()
:
fun main() {
var favoriteActor: String = "Sandra Oh"
}
- Tetapkan ulang variabel
favoriteActor
kenull
, lalu jalankan program ini:
fun main() {
var favoriteActor: String = "Sandra Oh"
favoriteActor = null
}
Anda mendapatkan pesan error ini:
Di Kotlin, ada perbedaan antara jenis nullable dan non-nullable:
- Jenis nullable adalah variabel yang dapat menyimpan
null
. - Jenis non-null adalah variabel yang tidak dapat menyimpan
null
.
Suatu jenis hanya nullable jika Anda secara eksplisit mengizinkannya untuk menyimpan null
. Seperti yang dinyatakan dalam pesan error, jenis data String
adalah jenis non-nullable sehingga Anda tidak dapat menetapkan ulang variabel ke null
.
Untuk mendeklarasikan variabel nullable di Kotlin, Anda perlu menambahkan operator ?
di akhir jenis. Misalnya, jenis String?
dapat menyimpan string atau null
, sedangkan jenis String
hanya dapat menyimpan string. Untuk mendeklarasikan variabel nullable, Anda harus menambahkan jenis nullable secara eksplisit. Tanpa jenis nullable, compiler Kotlin menyimpulkan bahwa variabel itu berjenis non-nullable.
- Ubah jenis variabel
favoriteActor
dari jenis dataString
menjadi jenis dataString?
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
favoriteActor = null
}
- Cetak variabel
favoriteActor
sebelum dan sesudah penetapan ulangnull
, lalu jalankan program ini:
fun main() {
var favoriteActor: String? = "Sandra Oh"
println(favoriteActor)
favoriteActor = null
println(favoriteActor)
}
Outputnya akan terlihat seperti cuplikan kode ini:
Sandra Oh null
Variabel favoriteActor
awalnya berisi string, lalu dikonversi menjadi null
.
Coba
Setelah dapat menggunakan jenis String?
nullable, dapatkah Anda melakukan inisialisasi pada variabel dengan nilai Int
dan menetapkannya kembali ke null
?
Menulis nilai Int
nullable
- Hapus semua kode di fungsi
main()
:
fun main() {
}
- Buat variabel
number
dari jenisInt
nullable, lalu tetapkan nilai10
padanya:
fun main() {
var number: Int? = 10
}
- Cetak variabel
number
, lalu jalankan program ini:
fun main() {
var number: Int? = 10
println(number)
}
Outputnya seperti yang diharapkan:
10
- Tetapkan ulang variabel
number
kenull
untuk mengonfirmasi bahwa variabel tersebut nullable:
fun main() {
var number: Int? = 10
println(number)
number = null
}
- Tambahkan pernyataan
println(number)
lain sebagai baris terakhir program, lalu jalankan:
fun main() {
var number: Int? = 10
println(number)
number = null
println(number)
}
Outputnya seperti yang diharapkan:
10 null
3. Menangani variabel nullable
Sebelumnya, Anda telah mempelajari cara menggunakan operator .
untuk mengakses metode dan properti variabel non-nullable. Di bagian ini, Anda akan mempelajari cara menggunakannya untuk mengakses metode dan properti variabel nullable.
Untuk mengakses properti variabel favoriteActor
non-nullable, ikuti langkah-langkah berikut:
- Hapus semua kode dalam fungsi
main()
, lalu deklarasikan variabelfavoriteActor
dari jenisString
dan tetapkan ke nama aktor favorit Anda:
fun main() {
var favoriteActor: String = "Sandra Oh"
}
- Cetak jumlah karakter di nilai variabel
favoriteActor
dengan propertilength
, lalu jalankan program ini:
fun main() {
var favoriteActor: String = "Sandra Oh"
println(favoriteActor.length)
}
Outputnya seperti yang diharapkan:
9
Ada sembilan karakter dalam nilai variabel favoriteActor
, yang mencakup spasi. Jumlah karakter pada nama aktor favorit Anda mungkin berbeda.
Mengakses properti variabel nullable
Misalkan Anda ingin membuat variabel favoriteActor
nullable agar orang yang tidak memiliki aktor favorit dapat menetapkan variabel ke null
.
Untuk mengakses properti variabel favoriteActor
nullable, ikuti langkah-langkah berikut:
- Ubah jenis variabel
favoriteActor
menjadi jenis nullable, lalu jalankan program ini:
fun main() {
var favoriteActor: String? = "Sandra Oh"
println(favoriteActor.length)
}
Anda mendapatkan pesan error ini:
Error ini merupakan error kompilasi. Seperti disebutkan dalam codelab sebelumnya, error kompilasi terjadi saat Kotlin tidak dapat mengompilasi kode karena error sintaksis dalam kode Anda.
Kotlin dengan sengaja menerapkan aturan sintaksis agar dapat mencapai keamanan null
, yang mengacu pada jaminan bahwa tidak akan ada panggilan yang tidak disengaja pada variabel yang mungkin null
. Ini bukan berarti variabel tidak boleh null
. Ini berarti, jika anggota variabel diakses, variabel tidak boleh null
.
Hal ini penting karena jika ada upaya untuk mengakses anggota variabel yang null
- dikenal sebagai referensi null
- selama aplikasi berjalan, aplikasi akan error karena variabel null
tidak berisi properti atau metode apa pun. Jenis error ini dikenal sebagai error runtime, yang terjadi setelah kode dikompilasi dan dijalankan.
Terkait dengan sifat keamanan null
Kotlin, error runtime seperti itu dicegah karena compiler Kotlin memaksakan pemeriksaan null
untuk jenis nullable. Pemeriksaan Null
mengacu pada proses pemeriksaan apakah variabel dapat berupa null
sebelum diakses dan diperlakukan sebagai jenis non-nullable. Jika ingin menggunakan nilai nullable sebagai jenis non-nullable, Anda harus melakukan pemeriksaan null
secara eksplisit. Anda akan mempelajari hal ini nanti di bagian Menggunakan kondisional if/else
dalam codelab ini.
Dalam contoh ini, kode gagal pada waktu kompilasi karena referensi langsung ke properti length
untuk variabel favoriteActor
tidak diizinkan karena ada kemungkinan variabel adalah null
.
Selanjutnya, Anda akan mempelajari berbagai teknik dan operator untuk bekerja dengan jenis nullable.
Menggunakan operator panggilan aman ?.
Anda dapat menggunakan operator panggilan aman ?.
untuk mengakses metode atau properti dari variabel nullable.
Untuk menggunakan operator panggilan aman ?.
guna mengakses metode atau properti, tambahkan simbol ?
setelah nama variabel dan akses metode atau properti dengan notasi .
.
Operator panggilan aman ?.
memungkinkan akses yang lebih aman ke variabel nullable karena compiler Kotlin menghentikan upaya akses anggota ke referensi null
dan menampilkan null
untuk anggota yang diakses.
Untuk mengakses properti variabel favoriteActor
nullable secara aman, ikuti langkah-langkah berikut:
- Dalam pernyataan
println()
, ganti operator.
dengan operator panggilan aman?.
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
println(favoriteActor?.length)
}
- Jalankan program ini, lalu verifikasi bahwa outputnya seperti yang diharapkan:
9
Jumlah karakter pada nama aktor favorit Anda mungkin berbeda.
- Tetapkan ulang variabel
favoriteActor
kenull
, lalu jalankan program ini:
fun main() {
var favoriteActor: String? = null
println(favoriteActor?.length)
}
Anda akan melihat output ini:
null
Perhatikan bahwa program tidak mengalami error meskipun ada upaya untuk mengakses properti length
dari variabel null
. Ekspresi panggilan aman akan menampilkan null
.
Menggunakan operator pernyataan not-null !!
Anda juga dapat menggunakan operator pernyataan not-null !!
untuk mengakses metode atau properti dari variabel nullable.
Setelah variabel nullable, Anda harus menambahkan operator pernyataan not-null !!
, diikuti dengan operator .
, lalu metode atau properti tanpa spasi.
Seperti namanya, jika Anda menggunakan pernyataan not-null !!
, artinya Anda menegaskan bahwa nilai variabel bukan null
, terlepas dari apakah itu yang terjadi atau tidak.
Tidak seperti operator panggilan aman ?.
, penggunaan operator pernyataan not-null !!
dapat mengakibatkan error NullPointerException
ditampilkan jika variabel nullable memang null
. Dengan demikian, tindakan tersebut hanya boleh dilakukan jika variabel selalu non-nullable atau penanganan pengecualian yang tepat telah ditetapkan. Jika tidak ditangani, pengecualian akan menyebabkan error runtime. Anda akan mempelajari penanganan pengecualian di unit berikutnya pada kursus ini.
Untuk mengakses properti variabel favoriteActor
dengan operator pernyataan not-null !!
, ikuti langkah-langkah berikut:
- Tetapkan ulang variabel
favoriteActor
ke nama aktor favorit Anda, lalu ganti operator panggilan aman?.
dengan operator pernyataan not-null!!
di pernyataanprintln()
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
println(favoriteActor!!.length)
}
- Jalankan program ini, lalu verifikasi bahwa outputnya seperti yang diharapkan:
9
Jumlah karakter pada nama aktor favorit Anda mungkin berbeda.
- Tetapkan ulang variabel
favoriteActor
kenull
, lalu jalankan program ini:
fun main() {
var favoriteActor: String? = null
println(favoriteActor!!.length)
}
Anda mendapatkan error NullPointerException
:
Error Kotlin ini menunjukkan bahwa program Anda mengalami error selama eksekusi. Dengan demikian, sebaiknya jangan gunakan operator pernyataan not-null !!
, kecuali jika Anda yakin bahwa variabelnya bukan null
.
Menggunakan kondisional if/else
Anda dapat menggunakan cabang if
dalam kondisional if/else
untuk melakukan pemeriksaan null
.
Untuk melakukan pemeriksaan null
, Anda dapat memeriksa apakah variabel nullable tidak sama dengan null
menggunakan operator perbandingan !=
.
Pernyataan if/else
Pernyataan if/else
dapat digunakan bersama dengan pemeriksaan null
sebagai berikut:
Pemeriksaan null berguna saat dikombinasikan dengan pernyataan if/else
:
- Pemeriksaan
null
dari ekspresinullableVariable != null
digunakan sebagai kondisiif
. - Isi 1 di dalam cabang
if
mengasumsikan bahwa variabel tersebut non-nullable. Oleh karena itu, dalam isi ini, Anda dapat bebas mengakses metode atau properti variabel seolah-olah variabel itu non-nullable tanpa menggunakan operator panggilan aman?.
atau operator pernyataan not-null!!
. - Isi 2 di dalam cabang
else
mengasumsikan bahwa variabel tersebutnull
. Oleh karena itu, dalam isi ini, Anda dapat menambahkan pernyataan yang harus dijalankan saat variabelnyanull
. Cabangelse
bersifat opsional. Anda hanya dapat menggunakan kondisionalif
untuk menjalankan pemeriksaannull
tanpa memberikan tindakan default saat pemeriksaannull
gagal.
Pemeriksaan null
lebih praktis digunakan dengan kondisi if
jika ada beberapa baris kode yang menggunakan variabel nullable. Sebaliknya, operator panggilan aman ?.
lebih praktis untuk referensi tunggal variabel nullable.
Untuk menulis pernyataan if/else
dengan pemeriksaan null
untuk variabel favoriteActor
, ikuti langkah-langkah berikut:
- Tetapkan variabel
favoriteActor
ke nama aktor favorit Anda lagi, lalu hapus pernyataanprintln()
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
}
- Tambahkan cabang
if
dengan kondisifavoriteActor != null
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
if (favoriteActor != null) {
}
}
- Dalam isi cabang
if
, tambahkan pernyataanprintln
yang menerima string"The number of characters in your favorite actor's name is ${favoriteActor.length}"
, lalu jalankan program ini:
fun main() {
var favoriteActor: String? = "Sandra Oh"
if (favoriteActor != null) {
println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
}
}
Outputnya seperti yang diharapkan.
The number of characters in your favorite actor's name is 9.
Jumlah karakter pada nama aktor favorit Anda mungkin berbeda.
Perhatikan bahwa Anda dapat mengakses metode panjang nama secara langsung dengan operator .
karena Anda mengakses metode length
di dalam cabang if
setelah pemeriksaan null
. Dengan demikian, compiler Kotlin mengetahui bahwa tidak ada kemungkinan bahwa variabel favoriteActor
adalah null
sehingga compiler mengizinkan akses langsung ke properti.
- Opsional: Tambahkan cabang
else
untuk menangani situasi ketika nama aktornyanull
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
if (favoriteActor != null) {
println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
} else {
}
}
- Dalam isi cabang
else
, tambahkan pernyataanprintln
yang menggunakan string"You didn't input a name."
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
if (favoriteActor != null) {
println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
} else {
println("You didn't input a name.")
}
}
- Tetapkan variabel
favoriteActor
kenull
, lalu jalankan program ini:
fun main() {
var favoriteActor: String? = null
if(favoriteActor != null) {
println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
} else {
println("You didn't input a name.")
}
}
Outputnya seperti yang diharapkan:
You didn't input a name.
Ekspresi if/else
Anda juga dapat menggabungkan pemeriksaan null
dengan ekspresi if/else
untuk mengonversi variabel nullable menjadi variabel non-nullable.
Untuk menetapkan ekspresi if/else
ke jenis non-nullable:
- Pemeriksaan
nullableVariable != null
null
digunakan sebagai kondisiif
. - Isi 1 di dalam cabang
if
mengasumsikan bahwa variabel tersebut non-nullable. Oleh karena itu, dalam isi ini, Anda dapat mengakses metode atau properti variabel seolah-olah variabel itu non-nullable tanpa operator aman?.
atau operator pernyataan not-null!!
. - Isi 2 di dalam cabang
else
mengasumsikan bahwa variabel tersebutnull
. Oleh karena itu, dalam isi ini Anda dapat menambahkan pernyataan yang harus dijalankan saat variabelnyanull
. - Pada baris terakhir isi 1 dan 2, Anda harus menggunakan ekspresi atau nilai yang menghasilkan jenis non-nullable sehingga jenis itu ditetapkan ke variabel non-nullable saat pemeriksaan
null
lulus atau gagal.
Untuk menggunakan ekspresi if/else
guna menulis ulang program sehingga hanya menggunakan satu pernyataan println
, ikuti langkah-langkah berikut:
- Tetapkan variabel
favoriteActor
ke nama aktor favorit Anda:
fun main() {
var favoriteActor: String? = "Sandra Oh"
if (favoriteActor != null) {
println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
} else {
println("You didn't input a name.")
}
}
- Buat variabel
lengthOfName
, lalu tetapkan ke ekspresiif/else
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
val lengthOfName = if(favoriteActor != null) {
println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
} else {
println("You didn't input a name.")
}
}
- Hapus kedua pernyataan
println()
dari cabangif
danelse
:
fun main() {
var favoriteActor: String? = "Sandra Oh"
val lengthOfName = if(favoriteActor != null) {
} else {
}
}
- Dalam isi cabang
if
, tambahkan ekspresifavoriteActor.length
:
fun main() {
val favoriteActor: String? = "Sandra Oh"
val lengthOfName = if(favoriteActor != null) {
favoriteActor.length
} else {
}
}
Properti length
dari variabel favoriteActor
diakses langsung dengan operator .
.
- Dalam isi cabang
else
, tambahkan nilai0
:
fun main() {
val favoriteActor: String? = "Sandra Oh"
val lengthOfName = if(favoriteActor != null) {
favoriteActor.length
} else {
0
}
}
Nilai 0
berfungsi sebagai nilai default jika namanya null
.
- Di akhir fungsi
main()
, tambahkan pernyataanprintln
yang menggunakan string"The number of characters in your favorite actor's name is $lengthOfName."
, lalu jalankan program ini:
fun main() {
val favoriteActor: String? = "Sandra Oh"
val lengthOfName = if(favoriteActor != null) {
favoriteActor.length
} else {
0
}
println("The number of characters in your favorite actor's name is $lengthOfName.")
}
Outputnya seperti yang diharapkan:
The number of characters in your favorite actor's name is 9.
Jumlah karakter pada nama yang Anda gunakan mungkin berbeda.
Menggunakan operator Elvis ?:
Operator Elvis ?:
adalah operator yang dapat Anda gunakan bersama operator panggilan aman ?.
. Dengan operator Elvis ?:
, Anda dapat menambahkan nilai default saat operator panggilan aman ?.
menampilkan null
. Ini serupa dengan ekspresi if/else
, tetapi dengan cara yang lebih idiomatis.
Jika variabel bukan null
, ekspresi sebelum operator Elvis ?:
dieksekusi. Jika variabel adalah null
, ekspresi setelah operator Elvis ?:
dieksekusi.
Untuk memodifikasi program sebelumnya untuk menggunakan operator Elvis ?:
, ikuti langkah-langkah ini:
- Hapus kondisional
if/else
, lalu tetapkan variabellengthOfName
ke variabelfavoriteActor
nullable dan gunakan operator panggilan aman?.
untuk memanggil propertilength
-nya:
fun main() {
val favoriteActor: String? = "Sandra Oh"
val lengthOfName = favoriteActor?.length
println("The number of characters in your favorite actor's name is $lengthOfName.")
}
- Setelah properti
length
, tambahkan operator Elvis?:
, diikuti dengan nilai0
, lalu jalankan program ini:
fun main() {
val favoriteActor: String? = "Sandra Oh"
val lengthOfName = favoriteActor?.length ?: 0
println("The number of characters in your favorite actor's name is $lengthOfName.")
}
Outputnya sama dengan output sebelumnya:
The number of characters in your favorite actor's name is 9.
4. Kesimpulan
Selamat! Anda telah mempelajari tentang nullability dan cara menggunakan berbagai operator untuk mengelolanya.
Ringkasan
- Variabel dapat ditetapkan ke
null
untuk menunjukkan bahwa variabel tersebut tidak memiliki nilai. - Variabel non-nullable tidak dapat ditetapkan ke
null
. - Variabel nullable dapat ditetapkan ke
null
. - Untuk mengakses metode atau properti variabel nullable, Anda perlu menggunakan operator panggilan aman
?.
atau operator pernyataan not-null!!
. - Anda dapat menggunakan pernyataan
if/else
dengan pemeriksaannull
untuk mengakses variabel nullable dalam konteks non-nullable. - Anda dapat mengonversi variabel nullable menjadi jenis yang non-nullable dengan ekspresi
if/else
. - Anda dapat memberikan nilai default saat variabel nullable adalah
null
dengan ekspresiif/else
atau operator Elvis?:
.