当我尝试在Kotlin中编写相当于try-with-resources的代码时,它对我不起作用.
我尝试了以下不同的变体:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但都不起作用.
有谁知道应该使用什么?显然Kotlin语法没有这种结构的定义,但可能是我遗漏了一些东西.它定义了try块的语法,如下所示:
try : "try" block catchBlock* finallyBlock?;
Run Code Online (Sandbox Code Playgroud) Kotlin提供了对象的use
功能Closeable
,但似乎他们忘记考虑AutoCloseable
(例如DB预处理语句)try-with-resources完全Java等价物.
我实施了下一个"自制"解决方案:
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用下一个方法:
fun countEvents(sc: EventSearchCriteria?): Long {
return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
var rs = it.executeQuery()
rs.next()
rs.getLong(1)
}
}
Run Code Online (Sandbox Code Playgroud)
我是Kotlin的新手,我想知道我是否遗漏了一些在我自己的解决方案中可能会给我带来生产环境中的问题/泄漏的重要内容.