我自己针对 Kotlin 缺少 try-with-resources 的解决方案

2023-11-25

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

然后你可以用下面的方式使用它:

fun countEvents(sc: EventSearchCriteria?): Long {
    return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
        var rs = it.executeQuery()
        rs.next()
        rs.getLong(1)
    }
}

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


您的实现可以正常工作,但它与标准的 try-with-resources 实现不同。如果你想让它像 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()
    }
  }
}

UPDATE:

As 富尔顿26在他的书中指出comment kotlin.Throwable不包含addSuppressed(Throwable)方法所以我们必须强制转换kotlin.Throwable to java.lang.Throwable使代码工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我自己针对 Kotlin 缺少 try-with-resources 的解决方案 的相关文章

随机推荐

  • Spinner 无法加载整数数组?

    我有一个应用程序 其中有一个微调器 我想用一些数字 4 8 12 16 填充它 我使用上述项目在 strings xml 中创建了一个整数数组对象 将 Spinner 的条目设置为整数数组 当我运行应用程序时 我得到 04 19 23 38
  • Vnext 参数 1:无法从“string”转换为“System.IO.Stream”

    我正在尝试创建一个Next 项目中的通用序列化器当我调用 StreamWriter 的构造函数时 它会抛出此编译器错误 错误 CS1503 参数 1 无法从 字符串 转换为 System IO Stream Test ASP NET Cor
  • 从 Javascript 更改 CSS 规则集

    是否可以动态更改 CSS 规则集 即 当用户单击小部件时 某些 JS 会更改 CSS 规则集 这个特定的 CSS 规则集应用于页面上的许多元素 通过类选择器 我想在用户单击小部件时对其进行修改 以便所有具有class change 可以 但
  • 使用 Asp.net 路由的 IRouteHandler.GetHttpHandler 中的会话为 null

    我试图在 IRouteHandler 类的 GettHttpHandler 方法中启用会话 但会话始终为空 有人可以告诉我我做错了什么吗 在 global asax 我有 RouteTable Routes Add All new Rout
  • 多次加载 DLL?

    我正在使用LoadLibrary在 Windows 中加载 DLL 的函数 我的问题是 如果我对同一个 DLL 多次调用此方法 我是否会获得该 DLL 的不同实例的句柄 或者它们都引用同一个实例 此外 这种行为与 Linux SO 文件有何
  • 有什么解决方案可以将验证码添加到 Django-allauth 吗?

    有没有将验证码与 django allauth 一起使用的解决方案 我想在注册表上使用验证码进行标准电子邮件 密码注册 我也需要用 django allauth 来做到这一点 并发现实现django recaptcha封装起来比较简单 配置
  • Node.js (ES6 / Babel) 中 import X 和 import * as X 的区别?

    我有一个 Node js 库lib用 ES6 编写 编译为Babel 其中我导出以下子模块 use strict import as config from config import as db from db import as sto
  • 编译时按架构排除go源文件

    我正在为 Windows 编写一个 Go 程序 其中包含多个包 其中一个包是使用 CGo 调用一些 h 和 c 文件中定义的一些函数 这些 c 文件依赖于 windows h 由于在 Windows 平台上开发非常繁琐 我想制作这个文件中的
  • 防止递归函数中出现 StackOverFlow

    我有一个递归函数BaseClass这依赖于一个protected virtual函数的返回条件 子类可能会错误地覆盖此函数并导致StackOverFlow例外 最糟糕的是有一些缓慢的网络调用 并且异常不会很快发生 许多资源浪费了很长一段时间
  • Swift DateFormatter 可选毫秒[重复]

    这个问题在这里已经有答案了 我有以下代码来解析 ISO8601 日期 let dateFormatter DateFormatter dateFormatter dateFormat yyyy MM dd T HH mm ss SSSZZZ
  • Jsoup.parse() 与 Jsoup.parse() - 或者 Jsoup 中的 URL 检测如何工作?

    Jsoup 有 2htmlparse 方法 解析 字符串 html 由于没有指定基本 URI 因此是绝对 URL 检测依赖于包含标签的 HTML 解析 字符串 html 字符串 baseUri HTML 所在的 URL 被检索自 用于将相对
  • 如何在 Mac OS X 中实现全局键盘挂钩?

    我知道这可以在 Windows 上完成XGrabKeyX11可以用 但是Mac OS X呢 我想创建一个类 允许设置即使应用程序窗口处于非活动状态也可以调用的快捷键 Cocoa 中 还没有 不支持这一点 您仍然可以使用旧的 Carbon 库
  • 在 IPython Notebook 中同时使用 Python 2.x 和 Python 3.x

    我使用 IPython 笔记本 并且希望能够选择在 IPython 中创建 2 x 或 3 x python 笔记本 我最初有Anaconda 使用 Anaconda 时 必须更改全局环境变量以选择所需的 Python 版本 然后才能启动
  • Mysql 错误 1452 - 无法添加或更新子行:外键约束失败

    我遇到了一个奇怪的问题 我正在尝试向引用另一个表的一个表添加外键 但由于某种原因失败了 由于我对 MySQL 的了解有限 唯一可能怀疑的是另一张表上有一个外键引用了我试图引用的表 我做了一个SHOW CREATE TABLE对两个表进行查询
  • 如何使用copy_from_user的正确方法?

    我正在尝试使用以下函数将值从用户空间复制到内核空间 static ssize t device write struct file filp const char buff size t len loff t off unsigned lo
  • D3D11:如何将 GDI 文本绘制到 GXDI 表面? (无 D2D)

    我需要一些帮助来使用 GDI 和 D3D11 将文本绘制到纹理 我尝试使用 D2D DirectWrite 但它仅支持 D3D10 而不支持我需要的 D3D11 到目前为止我尝试的一切都失败了 现在我想使用GDI方法来写入纹理 所以我用这个
  • 打字稿错误:Map.values() 给出 IterableIterator 不是 Iterable

    当我尝试迭代返回的值时 Typescript 给了我这个错误Map values 其中 Map 的类型为 错误 TS2495 类型 IterableIterator 不是数组类型或字符串类型 根据 ES6doc Map values 应该返
  • 如何让 numpy 在 Anaconda Python 3.7.6 中正常工作

    我正在尝试在 Python 中使用 NumPy 我刚刚安装了 Anaconda Python 3 7 一切似乎都很顺利 但是 我无法导入 numpy 使用行import numpy 当我这样做时 我收到以下错误 C Users jsmith
  • 停止Java中的循环线程

    我正在使用一个不断从队列中读取数据的线程 就像是 public void run Object obj while true synchronized objectsQueue if objectesQueue isEmpty try ob
  • 我自己针对 Kotlin 缺少 try-with-resources 的解决方案

    Kotlin 提供了use函数为Closeable对象 但似乎他们忘记考虑AutoCloseable 例如 DB 准备好的语句 用于 try with resources 完整的 Java 等效项 我已经实施了下一个 自制 解决方案 inl