Kotlin文件读取,使用块不捕获所有异常

时间:2018-01-04 13:55:23

标签: java android kotlin

我正在使用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风格? 感谢您的阅读

1 个答案:

答案 0 :(得分:3)

您可以将.use { ... }来电更改为无效安全通话(?.),然后返回usenull的返回值。