Closing Resources with use

use { }

Objects that hold resources (files, streams, database cursors) implement Closeable. use { } closes them automatically, even if an exception happens - Kotlin's version of Java try-with-resources.

Example

import java.io.BufferedReader
import java.io.Closeable
import java.io.StringReader

class DbConnection(val name: String) : Closeable {
    init { println("Open $name") }
    fun query(sql: String) = "result of '$sql'"
    override fun close() = println("Close $name")
}

fun main() {
    val csv = "id,name\n1,Asha\n2,Ravi"
    val lines = BufferedReader(StringReader(csv)).use { reader -> reader.readLines() }
    println(lines)

    try {
        DbConnection("orders-db").use { db ->
            println(db.query("SELECT * FROM orders"))
            throw IllegalStateException("network dropped")
        }
    } catch (e: IllegalStateException) {
        println("Caught: ${e.message}")
    }
}

Output

[id,name, 1,Asha, 2,Ravi]
Open orders-db
result of 'SELECT * FROM orders'
Close orders-db
Caught: network dropped