Какой смысл использовать функцию в Kotlin - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь использовать встроенную функцию use с FileInputStream вместо classi c 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 в попытку / поймать? Это кажется смешным.

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

Из Kotlin документации:

Выполняет указанную функцию блокировки для этого ресурса и затем корректно закрывает ее, независимо от того, сгенерировано исключение.

Когда вы используете объект, который реализует интерфейс Closeable , вам нужно вызвать метод close () , когда вы закончите с ним, чтобы он высвобождал любые системные ресурсы, связанные с объектом.

Вы должны быть осторожны и закрывать его, даже когда выдается исключение. В такой ситуации, которая подвержена ошибкам, потому что вы можете не знать или забыть обращаться с ней должным образом, лучше автоматизировать этот шаблон. Это именно то, что делает функция use .

0 голосов
/ 09 апреля 2020

Ваш try-catch не закрывает ресурс, поэтому вы сравниваете яблоки с апельсинами. Если вы закроете ресурс в блоке finally:

val is = FileInputStream(file)
try {
    ...
} 
catch (e: IOException) {
    ...
}
finally {
    is.close()
}

определенно более многословен, чем use, который обрабатывает закрытие ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...