Kotlin文件读取,使用块没有捕获所有的例外
我正在用Kotlin做一些文件IO,并想使用库中提供的那些很棒的扩展方法
val cacheDir = externalCacheDir File(cacheDir, "missingfile.dat") .inputStream() .use { //Use the file in someway }
所以当这个文件存在的时候这个效果很好,但是如果文件丢失了,我会得到一个FileNotFoundException
。
这是预料之中的。 但是,如果我想正确地处理它,我最终打破了令人敬畏的Kotlin语法包装在另一个尝试捕获
所以我挖了一下代码,看着inputStream()
调用
我看到这个
public inline fun File.inputStream(): FileInputStream { return FileInputStream(this) }
所以我想我会做我自己的扩展function,这样做。 在尝试中的包裹,至少在使用它时不可见
fun File.inputStreamOrNull(): FileInputStream? { return try { FileInputStream(this) } catch (e: Exception) { null } }
但是,在use
块内引发空指针exception
val cacheDir = externalCacheDir File(cacheDir, "protsfasfasfaso.mams") .inputStreamOrNull() .use { //Going to use null input stream :O }
但是, use
块实际上并没有捕捉到这一点,即使高阶函数被包装在try catch中也会导致应用程序崩溃
public inline fun 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风格? 谢谢阅读
您可以将.use { ... }
调用更改为空安全调用( ?.
),然后它将返回use
或null
的返回值。