当我尝试在Kotlin中编写等效的try-with-resources代码时,它对我不起作用 .
我尝试了以下不同的变体:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
但都不起作用 .
有谁知道应该使用什么?显然Kotlin语法doesn't have definition对于这样的构造,但可能是我遗漏了一些东西 . 它定义了try块的语法,如下所示:
try : "try" block catchBlock* finallyBlock?;
3 回答
kotlin stdlib(src)中有
use
功能 .如何使用它:
TL; DR
No special syntax, but use function
与Java相反,Kotlin没有特殊的语法 . 相反,try-with-resources,作为标准库函数
use
提供 .使用实现
此函数被定义为所有
Closeable?
类型的通用扩展 .Closeable
是Java的interface,允许从Java SE7开始尝试使用资源 .该函数采用函数文字
block
,它在try
中执行 . 与Java中的try-with-resources相同,Closeable
在finally
中得到 closed .在
block
内部发生的故障也导致close
执行,其中可能的异常只是忽略它们而实际上是"suppressed" . 这与try-with-resources不同,因为可以在Java的解决方案中请求此类异常 .如何使用它
use
扩展名可用于任何Closeable
类型,即流,阅读器等 .大括号中的部分是
use
中的block
(这里将lambda作为参数传递) . 块完成后,您可以确定FileInputStream
已关闭 .Edit :以下响应对Kotlin 1.0.x仍然有效 . 对于Kotlin 1.1,支持一个标准库,它以java 8为目标,支持可关闭的资源模式 .
对于不支持“use”功能的其他类,我已经完成了以下自制的try-with-resources:
然后您可以通过以下方式使用它: