() 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 IOException
, catch
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!
- Android SDKJava vs Kotlin: harus Anda menggunakan Kotlin untuk Android pengembangan?Jessica Thornsby
- Android SDKPengenalan Arsitektur Android komponenTin Megali
- Android SDKMemulai dengan RxJava 2 untuk AndroidJessica Thornsby
- Android SDKConcurrency di RxJava 2Chike Mgbemena