Exception Handling Kotlin

Muhammad Fajri
Monday, 12 April 2021

Bismillahirrahmanirrahim.

Exception handling merupakan blok dalam program yang menangani kesalahan yang terjadi. Kesalahan yang terjadi baik oleh program pada saat runtime atau oleh user saat melakukan penginputan data. Blok exception handling sangat berguna bagi user agar memiliki pesan yang dapat dibaca sehingga dapat melakukan penanganan. Blok ini juga bermanfaat saat proses pengembangan sistem sebelum melakukan deploy program aplikasi yang dibuat.

Exception Handling Kotlin

Pada Kotlin sendiri exception handling yang dimiliki memiliki kesamaan dengan Java, juga menggunakan struktur blok try catch finally. Apapun yang dipelajari mengenai exception handling pada Java sangat berguna saat belajar Kotlin. Akan tetapi, Kotlin menyederhanakan penanganan kesalahan dengan menggunakan unchecked exception. Yang artinya menuliskan blok try catch bersifat opsional. Perhatikan contoh berikut.

import java.io.FileReader
fun main() {
    var fileReader = FileReader("README.txt")

    var content = fileReader.read()
    println(content)
}

Dari program tersebut, pada baris kode var fileReader = FileReader("README.txt") akan menghasilkan exception FileNotFoundException. Dan pada baris var content = fileReader.read() akan menghasilkan exception IOException. Tapi, kabar bahagianya Kotlin membolehkan kita menuliskan kode tanpa perlu menangani Exception yang mungkin terjadi.

Membuat Exception Handling

Meskipun kita dapat menuliskan kode Kotlin tanpa membuat penanganan kesalahan. Akan tetapi, akan ada suatu kondisi di mana kita membutuhkannya. Jika hal ini terjadi, kita dapat membuatnya seperti cara pembuatannya dalam bahasa Java.

import java.io.FileNotFoundException
import java.io.FileReader
import java.io.IOException

fun main() {
    var fileReader: FileReader

    try {
        fileReader = FileReader("README.txt")
        var content = fileReader.read()
        println(content)
    }
    catch(ffe: FileNotFoundException) {
        var pesan = "File tidak ditemukan"
        println(ffe.message)
    }
    catch(ioe: IOException) {
        println(ioe.message)
    }
}

Handling Nulls

Dalam bahasa Kotlin terdapat cara yang memudahkan untuk meng-handle tipe data dengan nilai null. Diberikan contoh sebagai berikut.

var str: String = "Hello"
str = null // tidak akan berfungsi

Kita tidak akan dapat memberikan nilai null pada sebuah variabel. Kita mungkin melakukannya dengan nilai String yang berbeda, tetapi Kotlin menjamin bahwa str ini tidak akan bernilai null. Jika untuk beberapa alasan, kita benar-benar memerlukan variabel ini bernilai null, kita harus secara jelas menerangkan agar str ini merupakan tipe data Nullable. Untuk membuat tipe data (String, Int, atau yang lainnya) menjadi Nullable, kita gunakan tanda tanya (?) di bagian akhir tipe data yang dituliskan.

var str: String? = "Hello"

Setelah mendeklarasikan sebuah tipe data menjadi Nullable, kita harus melakukan sesuatu yang Kotlin lakukan untuk kita. Untuk tipe data yang bukan Nullable, Kotlin memastikannya cukup aman digunakan dalam operasi seperti assignment (penugasan), printing (cetak), melibatkannya dalam ekspresi, dan lainnya.

Saat kita membuat tipe data menjadi Nullable, Kotlin berasumsi bahwa kita tahu apa yang sedang kita lakukan dan bahwa kita cukup bertanggung jawab untuk menulis pelindung yang dibutuhkan untuk mencegah NullPointerExceptions, seperti contoh berikut.

fun main() {
    var a = arrayOf(1,2,3)
    printArr(null)
}

fun printArr(arr: Array<Int>?) {
    if(arr != null) {
        arr.forEach { i -> println(i) }
    }
}
  • arr: Array<Int>?, kita deklarasikan Array<Int> menjadi Nullable. Ini artinya kita dapat melewatkan nilai null pada printArr().
  • if(arr != null){..}, karena arr tidak lagi dijamin menjadi non-null, kita harus mengeceknya secara manual untuk nilai null sebelum melakukan operasi yang melibatkan variabel lokal arr.
  • arr.forEach { i -> println(i), jika arr tidak null, dengan aman kita dapat melakukan operasi ini.

Kotlin memperkenalkan operator yang dapat digunakan untuk meng-handle tipe data Nullable. Ini disebut safe-call operator, yang ditulis dengan simbol tanda tanya diikuti dot (?.) Kita dapat mengganti keseluruhan blok if yang melakukan pengecekan null dengan hanya satu buah statement.

arr?.forEach { i -> println(i) }

Apa itu safe call yaitu memeriksa pertama kali jika arr adalah null. Jika ya, eksekusi program tidak akan melanjutkan operasi forEach. Hanya jika arr tidak null, maka akan dilalui.

fun main() {
    var a = arrayOf(1,2,3)
    printArr(null)
}

fun printArr(arr: Array<Int>?) {
    if(arr != null) {
        arr?.forEach { i -> println(i) }
    }
}

Perilaku default Kotlin terkait objek yang null mencegah kita untuk melakukan hal-hal yang diinginkan karena Kotlin tidak membolehkan variabel bernilai null secara default. Akan tetapi, jika kita tahu apa yang sedang kita lakukan dan karena keadaan yang memaksa kita untuk menggunakan tipe data Nullable, kita masih dapat melakukannya. Tetap ingat saja untuk menggunakan safe call operator, dibandingkan jika menggunakan if untuk melakukan pemeriksaan nilai null.

Referensi

  1. Modul Pemrograman Mobile (Mobile Programming).
  2. Hagos, Ted. 2018. Learn Android Studio 3 with Kotlin: Efficient Android App Development. Apress: Manila.