Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我自己的Kotlin解决方案';让我们在没有资源的情况下试一试 > KTILN提供了代码>使用< /COD>函数,用于可关闭对象,但是它们似乎忘记考虑代码>自动关闭< /COD>(例如,DB准备语句),用于资源完全java等价的尝试。_Kotlin_Try With Resources_Autocloseable - Fatal编程技术网

我自己的Kotlin解决方案';让我们在没有资源的情况下试一试 > KTILN提供了代码>使用< /COD>函数,用于可关闭对象,但是它们似乎忘记考虑代码>自动关闭< /COD>(例如,DB准备语句),用于资源完全java等价的尝试。

我自己的Kotlin解决方案';让我们在没有资源的情况下试一试 > KTILN提供了代码>使用< /COD>函数,用于可关闭对象,但是它们似乎忘记考虑代码>自动关闭< /COD>(例如,DB准备语句),用于资源完全java等价的尝试。,kotlin,try-with-resources,autocloseable,Kotlin,Try With Resources,Autocloseable,我已经实施了下一个“自制”解决方案: inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R { try { return block(closeable); } finally { closeable.close() } } 我是Kotlin的新手,我想知道我自己的解决方案中是否遗漏了一些重要的东西,这些东西可能会在生产环境中给我带来

我已经实施了下一个“自制”解决方案:

inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
    try {
        return block(closeable);
    } finally {
        closeable.close()
    }
}

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

您的实现可以很好地工作,但它与标准的资源试用实现不同。如果您想让它像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()
    }
  }
}
inline fun trywr(可关闭:T,块:(T)->R:R{
var currentThrowable:java.lang.Throwable?=null
试一试{
返回块(可关闭)
}捕获(可丢弃:可丢弃){
currentThrowable=可作为java.lang.throwable丢弃
抛掷物
}最后{
如果(currentThrowable!=null){
试一试{
closeable.close()
}捕获(可丢弃:可丢弃){
currentThrowable.addSuppressed(throwable)
}
}否则{
closeable.close()
}
}
}
更新


正如他在
kotlin.Throwable
中指出的那样,Throwable不包含
addsupprested(Throwable)
方法,因此我们必须将
kotlin.Throwable
转换为
java.lang.Throwable
,以使代码工作。

我认为您想要的是
Closable
中定义的,因为kotlin 1.1,
.use
具有一个可自动关闭的
实现

@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)
    }
}
@SinceKotlin(“1.1”)
@抑制(“不可见的\u引用”、“不可见的\u成员”)
@kotlin.internal.InlineOnly
公共内联乐趣T.use(block:(T)->R:R{
变量异常:可丢弃?=null
试一试{
返回块(本)
}捕获(e:可丢弃){
异常=e
掷e
}最后{
此.closeFinally(例外)
}
}

复制他们不支持开箱即用的
自动关闭
的原因是他们仍然要实现Java8支持,以及支持JDK8类。您可以始终复制源代码,以便
使用
并将
可关闭
更改为
可自动关闭
(参见.java)考虑使用该模式。您可以在这里找到“<代码> AdEclipse(可投掷)< /Code >方法>代码> KOTLIN。可投掷< /Code >,并且不能在KTLLIN尝试catch中使用<代码> java .Lang.Primaby//Code >,因此该代码如何编译(除<代码> S/投掷/投掷/< /代码>)?@mfulton26我认为它应该是
异常
而不是
可丢弃的
@mfulton26谢谢,这是一个很好的观点。更新了代码以使其可编译。
@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)
    }
}