我正在使用Kotlin做一些文件IO,并希望使用库中提供的那些很棒的扩展方法
val cacheDir = externalCacheDir
File(cacheDir, "missingfile.dat")
.inputStream()
.use {
//Use the file in someway
}
所以当文件存在时,这很有用
但如果文件丢失,我会得到FileNotFoundException
。
这是预期的。但是,如果我想正确处理它,我最终通过将其包装在另一个try catch
中来打破那个令人敬畏的Kotlin语法所以我稍微挖了一下代码并查看了inputStream()
调用
我看到了这个
public inline fun File.inputStream(): FileInputStream {
return FileInputStream(this)
}
所以我认为我自己做了扩展功能。尝试抓住,至少在使用它时不可见
fun File.inputStreamOrNull(): FileInputStream? {
return try {
FileInputStream(this)
} catch (e: Exception) {
null
}
}
但是,use
块
val cacheDir = externalCacheDir
File(cacheDir, "protsfasfasfaso.mams")
.inputStreamOrNull()
.use {
//Going to use null input stream :O
}
然而,use
块实际上并没有捕获这个,即使高阶函数也包含在try catch中,最终导致应用程序崩溃
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
有人对此有任何想法吗? 我知道快速解决方法,但有没有办法保持酷酷的Kotlin风格? 感谢您的阅读
答案 0 :(得分:3)
您可以将.use { ... }
来电更改为无效安全通话(?.
),然后返回use
或null
的返回值。