Kotlin为可关闭的对象提供了使用函数,但似乎他们忘记了考虑使用Java等效的try with resources full。
我已经实施了下一个“自制”解决方案:
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
然后您可以通过下一种方式使用它:
fun countEvents(sc: EventSearchCriteria?): Long {
return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
var rs = it.executeQuery()
rs.next()
rs.getLong(1)
}
}
我是Kotlin的新手,我想知道我自己的解决方案中是否遗漏了一些重要的东西,这些东西可能会在生产环境中给我带来问题/泄漏。
我认为您想要的是Closable
上定义的use()
。
自Kotlin 1.1以来,。使用具有可自动关闭的实现。
@SinceKotlin("1.1")
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
@kotlin.internal.InlineOnly
public inline fun <T : AutoCloseable?, R> T.use(block: (T) -> R): R {
var exception: Throwable? = null
try {
return block(this)
} catch (e: Throwable) {
exception = e
throw e
} finally {
this.closeFinally(exception)
}
}
从源复制
您的实现可以很好地工作,但它不同于标准的资源试用实现。如果你想让它像Java一样工作,你应该这样做:
inline fun <T : AutoCloseable, R> trywr(closeable: T, block: (T) -> R): R {
var currentThrowable: java.lang.Throwable? = null
try {
return block(closeable)
} catch (throwable: Throwable) {
currentThrowable = throwable as java.lang.Throwable
throw throwable
} finally {
if (currentThrowable != null) {
try {
closeable.close()
} catch (throwable: Throwable) {
currentThrowable.addSuppressed(throwable)
}
} else {
closeable.close()
}
}
}
更新:
正如mfulton26在其评论kotlin中指出的那样。Throwable不包含addSuppressed(Throwable)方法,因此我们必须强制转换kotlin。可丢弃到java。lang.Throwable使代码工作。
我有一个使用Kotlin 1.0版的Android项目。Android Studio中的0-beta-1038。 我可以在不同的部分使用Kotlin运行它,它在模拟器中编译并工作,但当我尝试使用ReadWriteProperty时,它会给出以下错误消息: 未解析的引用:ReadWriteProperty 类称为首选Utils.kt: build.grade(模块:app) build.grade(
我正在尝试用Java编写下面用Kotlin编写的代码。我无法创建DefaultElementsAdapter,因为我无法获得正确的语法。 我无法获得正确的Java代码 Kotlin班是这样的 我正在尝试使用图书馆https://github.com/m7mdra/HtmlRecycler
我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?
为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D
在Kotlin中,我覆盖了这两个Google登录功能: 检查与谷歌的连接是否失败。 问题是,有时当我关闭包含用户帐户的对话框时,该对话框会在活动启动时弹出 像这样: 我得到了一个带有以下logcat的<code>IllegalArgumentException</code> E/AndroidRuntime:致命异常:主进程:com.dancam.subscriptions,PID:6346 Ja
简而言之,我的问题是我不能在用Kotlin编写的活动中使用GlideApp(生成的API)。 有趣的是,Android Studio看到了参考,我可以打开生成的GlideApp,有代码完成,但当我尝试构建它时,它失败了 “未解析的引用:GlideApp” glide模块是用java实现的,因为大多数应用程序代码都是用java编写的。 有什么想法吗?