当前位置: 首页 > 知识库问答 >
问题:

我自己的解决静态编程语言尝试资源缺失的方法

后星河
2023-03-14

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的新手,我想知道我自己的解决方案中是否遗漏了一些重要的东西,这些东西可能会在生产环境中给我带来问题/泄漏。

共有3个答案

杜河
2023-03-14

我认为您想要的是Closable上定义的use()

宣望
2023-03-14

自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)
    }
}

从源复制

百里锋
2023-03-14

您的实现可以很好地工作,但它不同于标准的资源试用实现。如果你想让它像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编写的。 有什么想法吗?