Kotlin 中使用函数的意义何在
Posted
技术标签:
【中文标题】Kotlin 中使用函数的意义何在【英文标题】:What's the point of the use function in Kotlin 【发布时间】:2020-04-09 09:31:09 【问题描述】:我正在尝试将内联函数 use
与 FileInputStream 一起使用,而不是经典的 try/catch IOException,以便
try
val is = FileInputStream(file)
// file handling...
catch (e: IOException)
e.printStackTrace()
变成
FileInputStream(file).use fis ->
// do stuff with file
我的问题是,如果函数use
仍然抛出异常,为什么还要使用它?我是否必须将 use
包装在 try/catch 中?这看起来很荒谬。
【问题讨论】:
文件不是托管资源,java 不知道何时释放它。它不受垃圾收集器管理。您需要正确关闭它。不管失败与否,都完成了。use
相当于 java 7 中的 try-with-resources
docs.oracle.com/javase/tutorial/essential/exceptions/…
【参考方案1】:
来自 Kotlin 文档:
在这个资源上执行给定的块函数然后关闭它 无论是否抛出异常,都正确向下。
当你使用一个实现了Closeable接口的对象时,你需要在使用完成后调用close()方法,这样它就会释放所有系统资源与对象相关联。
即使抛出异常,您也需要小心并关闭它。在这种容易出错的情况下,由于您可能不知道或忘记正确处理它,最好将这种模式自动化。这正是 use 函数所做的。
【讨论】:
【参考方案2】:您的try-catch
没有关闭资源,因此您将苹果与橙子进行比较。如果关闭finally
块中的资源:
val is = FileInputStream(file)
try
...
catch (e: IOException)
...
finally
is.close()
肯定比处理关闭资源的use
更详细。
【讨论】:
这更像是 try-with-resources。try(val is = FileInputStream(file)) ...
@AccessDenied 你能解释一下val is
怎么可能是空的吗?我是 Kotlin 的新手,也许我遗漏了一些东西。以上是关于Kotlin 中使用函数的意义何在的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )