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 { ... }调用更改为空安全调用( ?. ),然后它将返回usenull的返回值。