Advertisement
  1. Code
  2. Kotlin

Kotlin dari awal: Exception Handling

Scroll to top
Read Time: 8 min
This post is part of a series called Kotlin From Scratch.
Kotlin From Scratch: Abstract Classes, Interfaces, Inheritance, and Type Alias

() translation by (you can also view the original English article)

Kotlin adalah bahasa pemrograman modern yang mengkompilasi ke Java bytecode. Bebas dan open source, dan membuat coding untuk Android bahkan lebih menyenangkan.

Dalam artikel sebelumnya, Anda akan belajar lebih banyak tentang pemrograman berorientasi obyek dengan menggali ke kelas abstrak, interface, pewarisan, dan tipe alias di Kotlin.

Dalam posting ini, Anda akan terus belajar tentang pemrograman di Kotlin dengan belajar tentang exception dan bagaimana untuk menangani mereka.

1. Menangani Excepetion

Exception yang digunakan untuk menunjukkan masalah dalam kode kita pada pelaksanaan program. Penaganan Exception adalah kemampuan untuk  (atau menangani) Exception yang mungkin terjadi. Jika kami tidak menangani Exception yang terjadi, program kami akan menghentikan eksekusi tiba-tiba — aka segera crash.

Penangann Exception memungkinkan program untuk melanjutkan eksekusi bahkan jika ada exception (meskipun sangat dianjurkan untuk login Anda pengecualian dan laporan mereka menggunakan alat seperti Crashlytics crash reporting).

Di Java, kita memiliki dua jenis exception: checked dan unchecked. Saya akan secara singkat menjelaskan keduanya, tetapi kita akan mulai dengan unchecked exception.

Unchecked Exception

Berikut adalah exception yang dilemparkan karena kelemahan dalam kode Anda. Mereka adalah sebuah subclass langsung atau tidak langsung dari RuntimeException superclass.

Contoh unchecked exception termasuk:

  • ArithmeticException: dilempar ketika Anda membagi dengan nol.
  • ArrayIndexOutOfBoundExceptions: dilempar ketika array telah diakses dengan indeks ilegal.
  • SecurityException: dilemparkan oleh Manajer keamanan untuk menunjukkan pelanggaran keamanan.
  • NullPointerException: dilempar ketika menerapkan metode atau properti pada objek null.

Metode yang mungkin memunculkan exception dicentang tidak berisi informasi tentang pengecualian dilemparkan pada deklarasinya metode.

1
public Integer divideByZero(Integer numerator, Integer denominator) {
2
    return numerator / denominator;
3
}
4
5
divideByZero(7, 0) // throws ArithmeticException

Jenis dari exception dapat dicegah dengan pengkodean yang benar. Pada kode diatas, kita harus memiliki diperiksa jika penyebut adalah nol sebelum melakukan operasi. Untuk pengecualian ini, pengembang tidak perlu untuk menangkap exception menggunakan try... catch blok. Dengan kata lain, kita tidak dipaksa oleh kompilator untuk membungkus kode yang mungkin memicu pengecualian di try... catch blok. Sebaliknya, kita harus pastikan exception tidak pernah terjadi di awal.

Juga, ingat, Kotlin adalah bahasa yang aman dari null. Dengan kata lain, itu dapat membantu kita menghindari NullPointerExceptions dalam kode kita. Anda dapat membaca Nullability, loop, dan kondisi posting untuk mendapatkan penyegaran null safety dalam Kotlin.

Checked Exception di Java

Metode yang mungkin melempar exception  perlu menyatakan dengan statemen dalam khasnya metode yang menggunakan kata kunci throws. Jika Anda memanggil metode yang melempar exception itu adalah checked exception, Anda juga perlu untuk membuangnya lagi dari fungsi Anda atau untuk menangkap dan menanganinya menggunakan try...catch blok.

Checked Exception  adalah exception yang diperiksa pada waktu kompilasi. Jenis-jenis exception mewarisi dari kelas Exception. Contoh dari pengecualian semacam ini adalah IOException. Hal ini dapat terjadi ketika Anda mencoba untuk mengakses file yang tidak dapat dibuka karena tidak ada. (FileNotFoundException adalah sebuah subclass dari IOException.)

1
// perform in a background thread

2
public void editFile(File file, String text) {
3
    try {
4
        file.getParentFile().mkdirs();
5
        FileOutputStream fileOutputStream = new FileOutputStream(file);
6
        Writer writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
7
        try {
8
            writer.write(text);
9
            writer.flush();
10
            fileOutputStream.getFD().sync();
11
        } finally {
12
            writer.close();
13
        }
14
    } catch (IOException e) {
15
        // Log the exception

16
        e.printStackTrace();
17
    }
18
}

Dalam kode sebelumnya, kita menggunakan try... catch blok untuk menangani IOException di dalam metode editFile(). Kita sekarang dapat memanggil metode editFile() seperti biasa, dan kompilator tidak akan mengeluh.

1
editFile(new File(""), "my text");

Lihat kode di bawah ini, kita telah merefractor metode menggunakan throw kata kunci dalam pemanggilan metode. Ini menunjukkan kepada pemanggil bahwa mereka harus menangani exception IOException yang mungkin dilemparkan saat memanggil metode editFile().

1
// this should be in a background thread

2
public void editFile(File file, String text) throws IOException {
3
    file.getParentFile().mkdirs();
4
    FileOutputStream fileOutputStream = new FileOutputStream(file);
5
    Writer writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
6
    try {
7
        writer.write(text);
8
        writer.flush();
9
        fileOutputStream.getFD().sync();
10
    } finally {
11
        writer.close();
12
    }
13
}

Untuk memanggil metode di atas, kita perlu membukusnya dengan try... catch blok untuk menangani exception.

1
try {
2
    editFile(new File(""), "my text");
3
} catch (IOException e) {
4
    e.printStackTrace();
5
}

Ini telah menjadi singkat melihat pengecualian di Java. Mari kita sekarang melihat bagaimana Kotlin menangani exception.

2. Exception di Kotlin

Perbedaan utama antara Kotlin dan Java mekanisme exception adalah bahwa semua exception adalah unchecked di Kotlin. Dengan kata lain, mereka tidak secara eksplisit dinyatakan dalam fungsi signature, seperti di Java.

1
fun editFile(file: File, text: String) {
2
    file.parentFile.mkdirs()
3
    val fileOutputStream = FileOutputStream(file)
4
    val writer = BufferedWriter(OutputStreamWriter(fileOutputStream))
5
    try {
6
        writer.write(text)
7
        writer.flush()
8
        fileOutputStream.fd.sync()
9
    } finally {
10
        writer.close()
11
    }
12
}

Di sini, kita telah mekonversi metode editFile() ke fungsi Kotlin. Anda dapat melihat bahwa fungsi tidak memiliki throw IOException pernyataan dalam khasnya fungsi. throw bahkan tidak kata kunci dalam Kotlin.

Juga, kita dapat memanggil fungsi ini tanpa membungkusnya dengan try... catch blok — dan kompilator tidak akan mengeluh. Dengan kata lain, ada ada hal seperti memeriksa pengecualian dalam Kotlin. Semua pengecualian dicentang. (Perhatikan bahwa jika ada pengecualian dilemparkan, pelaksanaan program akan berhenti seperti biasa.)

Jika kita berpikir exception ini mungkin timbul, kami masih harus menangani membungkus dengan try... catch blok- tetapi ini tidak dipaksakan oleh kompiler Kotlin.

1
try {
2
    editFile(File(""), "text 123")
3
} catch (e: IOException) {
4
    e.printStackTrace()
5
}

Jika excption yang dilemparkan di dalam fungsi editFile() adalah instance kelas IOExceptioncatch blok akan dieksekusi, dan kita hanya mencetak pelacakan stack untuk keperluan debugging.

Try... catch blok

Try dengan catch dan finally klausul dalam Kotlin ini mirip dengan Java.

1
fun foo() {
2
    try {
3
        throw Exception("Exception message")
4
    } catch (e: Exception) {
5
        println("Exception handled")
6
    } finally {
7
        println("inside finally block")
8
    }
9
}

Di sini, kita membuang Exception objek di dalam blok try. Perhatikan kita tidak termasuk kata kunci new seperti yang kita lakukan di Java untuk membuat sebuah instance baru. Perhatikan juga bahwa kami tidak menetapkan exception yang akan dilemparkan pada signature fungsi seperti yang kita harus di Java.

Kami menangani semua subclass dan kelas jenis Exception di catch blok. Opsional finally blok selalu dijalankan — ini adalah dimana kita biasanya tutup koneksi yang sebelumnya dibuka sehingga dapat mencegah kebocoran sumber atau sumber daya. Misalnya, jika Anda membuka file atau membuat koneksi database atau jaringan di blok try, Anda harus menutup atau bebas dalam finally blok.

Perhatikan bahwa dalam Kotlin throw adalah ekspresi dan dapat menggabungkan dengan ekspresi lain.

1
val letter = 'c'
2
val result =
3
        if (letter in 'a'..'z')
4
            letter
5
        else
6
            throw IllegalArgumentException("A letter must be between a to z")

Juga, try juga dapat digunakan sebagai ekspresi.

1
fun foo(number: Int) {
2
    val result =  try {
3
        if (number != 1) {
4
            throw IllegalArgumentException()
5
        }
6
        true
7
    } catch (e: IllegalArgumentException) {
8
        false
9
    }
10
11
    println(result)
12
}
13
14
foo(2) // false

Di sini, kita diberi nilai kembali dari try... catch blok ke variabel result. Jika nomor tidak 1, itu melempar IllegalArgumentException dan catch blok dijalankan. Ekspresi false dalam blok catch akan ditempatkan ke variabel result. Jika nomor 1 sebaliknya, maka nilai true ekspresi akan ditempatkan ke variabel result.

Java Interop

Exception dalam Kotlin berperilaku seperti di Java - tetapi saya ingin membuat Anda menyadari anotasi berguna yang disebut @Throws di Kotlin yang mungkin akan berguna. Karena semua exception dalam Kotlin unchecked, pengembang yang mengkonsumsi kode Kotlin dari Java mungkin tidak akan menyadari bahwa fungsi Anda melempar exception. Namun, Anda masih dapat menambahkan kemungkinan exception yang mungkin dilemparkan ke method signature dengan anotasi @Throw. Ini akan mengingatkan Java pemanggil bahwa mereka harus menangani exception.

Mari kita lihat sebuah contoh praktis dari penjelasan ini.

1
/* Functions.kt file */
2
fun addNumberToTwo(a: Any): Int {
3
    if (a !is Int) {
4
        throw IllegalArgumentException("Number must be an integer")
5
    }
6
    return 2 + a
7
}

Di sini, kita mendefinisikan fungsi Kotlin yang dapat memunculkan exception IllegalArgumentException hanya jika jenis yang dilewatkan ke fungsi bukan tipe Int.

Kita memanggil addNumberToTwo() top-level fungsi ini langsung dari Java dengan cara sebagai berikut:

1
public void myJavaMethod() {
2
    Integer result = FunctionsKt.addNumberToTwo(5);
3
    System.out.println(result); // 7

4
}

Ini bekerja baik; kompilator tidak mengeluh. Namun, jika kita ingin berkomunikasi dengan Java pemanggil bahwa fungsi top-level addNumberToTwo() melempar sebuah exception, kami hanya menambahkan anotasi @Throws untuk fungsi signature.

1
@Throws(IllegalArgumentException::class)
2
fun addNumberToTwo(a: Any): Int {
3
    if(a !is Int) {
4
        throw IllegalArgumentException("Number must be an integer")
5
    }
6
    return 2 + a
7
}

Penjelasan @Throws ini dapat menerima dipisahkan dengan koma daftar argumen class exception. Pada kode diatas, kita hanya memasukan satu exception class-IllegalArgumentException.

Sekarang kita harus memperbarui kami kode Java untuk menangani exception.

1
public void myJavaMethod() throws IllegalArgumentException {
2
    Integer result = FunctionsKt.addNumberToTwo(5);
3
    System.out.println(result);
4
}

Jika kita mendekompilasi fungsi addNumberToTwo() Kotlin, menggunakan fitur Show Kotlin Bytecode (jika Anda berada di IntelliJ IDEA atau Android Studio, menggunakan Tools > Kotlin > Show Kotlin Bytecode), kita akan melihat kode Java berikut:

1
// ... 

2
public static final int addNumberToTwo(@NotNull Object a) throws IllegalArgumentException {
3
   Intrinsics.checkParameterIsNotNull(a, "a");
4
   if (!(a instanceof Integer)) {
5
      throw (Throwable)(new IllegalArgumentException("Number must be an integer"));
6
   } else {
7
      return 2 + ((Number)a).intValue();
8
   }
9
}
10
// ... 

Di atas kode Java (beberapa unsur kode yang dihapus untuk singkatnya), Anda dapat melihat bahwa kompilator ditambahkan kata kunci throw ke signature metode — karena kami termasuk anotasi @Throws.

Kesimpulan

Dalam tutorial ini, Anda akan belajar lebih banyak tentang pemrograman di Kotlin dengan melihat ke dalam exception. Kami melihat bahwa Kotlin tidak memiliki checked exception pengecualian tapi sebaliknya, Semua exception adalah unchecked. Kami juga melihat bagaimana menangani exception menggunakan try... catch blok dan melihat kegunaan anotasi @Throws di Kotlin untuk pemanggil Java.

Untuk mempelajari lebih lanjut tentang bahasa Kotlin, saya sarankan mengunjungi dokumentasi Kotlin. Atau check out beberapa kami Android app pembangunan posting lain di sini di Envato Tuts!


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.