Belajar Dasar Kotlin: Penanganan Error/Eksepsi

Dalam membuat program, kita akan selalu berurusan dengan error. Error dalam pemrograman lebih sering disebut dengan eksepsi (exception).

Menangkap Error

Error yang tidak ditangkap bisa menyebabkan program dihentikan tiba-tiba alias crash. Contohnya seperti ini:

val teks = "ABC"
val angka = teks.toInt()
println("Hasilnya ${angka}")
println("Program selesai")

/*
java.lang.NumberFormatException: For input string: "ABC"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Integer.parseInt(Integer.java:652)
        at java.base/java.lang.Integer.parseInt(Integer.java:770)
*/

Pada program di atas kita mengubah sebuah teks menjadi angka. Pada program tersebut terjadi error dikarenakan teks yang kita berikan tidak bisa diubah menjadi angka. Sehingga semua kode setelah teks.toInt() tidak di jalankan. Error yang terjadi mempunyai kelas NumberFormatException.

Untuk menangkap error kita bisa menggunakan try-catch. Secara bahasa try berarti coba sedangkan catch berarti tangkap. Berikut adalah contohnya:

val teks = "ABC"
try {
        val angka = teks.toInt()
        println("Hasilnya ${angka}")
} catch (error: NumberFormatException) {
        println("Tidak dapat mengubah teks menjadi angka")
        println("Terjadi error ${error}");
}
println("Program selesai")

Maksud kode di atas adalah mencoba menjalankan blok kode try. Kemudian, jika terjadi error yang mempunyai kelas NumberFormatException maka error tersebut akan ditangkap dan blok kode catch dijalankan. Pada blok kode catch, variabel bernama error akan berisi error yang ditangkap. Nama variabel ini ditentukan oleh argumen yang diberikan ke blok kode catch.

Kode di atas menghasilkan output seperti berikut:

Tidak dapat mengubah teks menjadi angka
Terjadi error java.lang.NumberFormatException: For input string: "ABC"
Program selesai

Terlihat bahwa kode setelah try-catch tetap dijalankan walaupun terjadi error.

Jika teks kita ubah menjadi teks yang bisa diubah menjadi angka, contohnya seperti ini:

val teks = "12"
// kodenya sama

Maka output program menjadi seperti ini:

Hasilnya 12
Program selesai

Pada penangkapan error, kita bisa menambahkan blok kode finally. Contohnya seperti ini:

val teks = "12"
try {
        val angka = teks.toInt()
        println("Hasilnya ${angka}")
} catch (error: NumberFormatException) {
        println("Tidak dapat mengubah teks menjadi angka")
        println("Terjadi error ${error}");
} finally {
        println("Blok finally dipanggil")
}
println("Program selesai")

Blok kode finally akan selalu dijalankan. Blok kode ini dijalankan setelah blok kode try selesai. Jika terjadi, error blok kode ini dijalankan setelah blok kode catch selesai di jalankan.

Output program di atas seperti berikut:

Hasilnya 12
Blok finally dipanggil
Program selesai

Saat penangkapan error dengan try kita harus menyediakan salah satu dari blok kode catch dan finally. Kita juga bisa memiliki blok kode catch lebih dari satu. Pada setiap blok kode catch nama eksepsi yang ditangkap haruslah berbeda. Contohnya seperti ini:

val teks: String? = null
try {
        val angka = teks!!.toInt()
        println("Hasilnya ${angka}")
} catch (error: NullPointerException) {
        println("Variabel teks berisi null")
} catch (error: NumberFormatException) {
        println("Tidak dapat mengubah teks menjadi angka")
        println("Terjadi error ${error}");
}

Blok kode catch yang pertama akan dijalankan jika error yang terjadi adalah NullPointerException dan blok kode catch kedua akan dijalankan jika error yang terjadi adalah NumberFormatException.

Membuat Error

Error dapat dibuat dengan menggunakan keyword throw. Secara bahasa throw berarti melempar. Jadi keyword throw digunakan untuk melemparkan error. Keyword ini membutuhkan objek error. Objek error merupakan objek yang kelasnya merupakan turunan dari kelas Throwable. Contohnya:

throw Exception("Error aneh terjadi")

Error ini juga bisa ditangkap dengan try-catch. Contohnya:

try {
        throw Exception("Error aneh terjadi")
} catch (e: Exception) {
        println("Error terjadi")
        println(e)
}

/*
Error terjadi
java.lang.Exception: Error aneh terjadi
*/