Ketika saya mencoba untuk menulis setara try
dengan kode Java -dengan-sumber daya di Kotlin, itu tidak berhasil untuk saya.
Saya mencoba berbagai variasi berikut ini:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Tapi tidak ada yang berhasil.
Apakah ada yang tahu apa yang harus digunakan? Tampaknya tata bahasa Kotlin tidak memiliki definisi untuk konstruksi seperti itu, tapi mungkin aku kehilangan sesuatu. Ini mendefinisikan tata bahasa untuk blok coba sebagai berikut:
try : "try" block catchBlock* finallyBlock?;
OutputStreamWriter
juga:r.outputStream.writer.use { ... }
use
ekstensi: kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL; DR: Tidak ada sintaks khusus, hanya sebuah fungsi
Kotlin, tidak seperti Java, tidak memiliki sintaks khusus untuk ini. Sebaliknya, coba-dengan-sumber daya , ditawarkan sebagai fungsi perpustakaan standar
use
.The
use
implementasiFungsi ini didefinisikan sebagai ekstensi umum pada semua
Closeable?
jenis.Closeable
adalah antarmuka Java yang memungkinkan coba-dengan-sumber daya pada Java SE7 .Fungsi ini mengambil fungsi literal
block
yang dijalankan di atry
. Sama seperti dengan coba-dengan-sumber daya di Jawa,Closeable
akan ditutup dalam afinally
.Juga kegagalan yang terjadi di dalam
block
menyebabkanclose
eksekusi, di mana kemungkinan pengecualian secara harfiah "ditekan" dengan hanya mengabaikannya. Ini berbeda dari coba-dengan-sumber daya , karena pengecualian seperti itu dapat diminta dalam solusi Java .Bagaimana cara menggunakannya
The
use
ekstensi tersedia pada setiapCloseable
jenis, yaitu sungai, pembaca dan sebagainya.Bagian dalam kurung keriting adalah apa yang menjadi
block
dalamuse
(lambda dilewatkan sebagai argumen di sini). Setelah blok selesai, Anda dapat yakin bahwaFileInputStream
itu telah ditutup.sumber
Sunting : Respons berikut masih valid untuk Kotlin 1.0.x. Untuk Kotlin 1.1, ada dukungan perpustakaan standar yang menargetkan Java 8 untuk mendukung pola sumber daya yang dapat ditutup.
Untuk kelas-kelas lain yang tidak mendukung fungsi "use", saya telah melakukan try-with-resources buatan sendiri berikut ini:
Maka Anda dapat menggunakannya dengan cara berikut:
sumber
try/finally
blok sederhanaKarena posting StackOverflow ini berada di dekat bagian atas hasil pencarian saat ini untuk "contoh dekat kotlin," namun tidak ada jawaban lain (atau dokumen resmi) yang dengan jelas menjelaskan cara memperluas
Closeable
(aliasjava.io.Closeable
), saya pikir saya akan menambahkan contoh tentang cara membuat kelas Anda sendiri yang meluasCloseable
. Bunyinya seperti ini:Dan kemudian menggunakannya:
Lihat contoh ini di Taman Bermain Kotlin sini .
sumber