Когда я попытался написать эквивалент try
кода Java -with-resources в Kotlin, это не сработало для меня.
Я пробовал разные варианты следующего:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Но ни один не работает.
Кто-нибудь знает, что следует использовать вместо этого? Очевидно, у грамматики Котлина нет определения для такой конструкции, но, возможно, я что-то упустил. Он определяет грамматику для блока try следующим образом:
try : "try" block catchBlock* finallyBlock?;
OutputStreamWriter
:r.outputStream.writer.use { ... }
use
расширение: kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL; DR: нет специального синтаксиса, только функция
В отличие от Java, Kotlin не имеет специального синтаксиса для этого. Вместо этого в качестве стандартной функции библиотеки предлагается try-with-resources
use
.В
use
реализацииЭта функция определяется как общее расширение для всех
Closeable?
типов.Closeable
является в Java - интерфейс , который позволяет попробовать-с ресурсами , как в Java SE7 .Функция принимает литерал функции,
block
который выполняется вtry
. То же самое с примеркой с-ресурсами в Java, тоCloseable
получает закрыто вfinally
.Также сбои, происходящие внутри,
block
приводят кclose
выполнению, где возможные исключения буквально «подавляются», просто игнорируя их. Это отличается от try-with-resources , потому что такие исключения могут быть запрошены в решении Java .Как это использовать
use
Расширение доступно на любомCloseable
типе, то есть потоки, читатели и так далее.Часть в фигурных скобках , что становится
block
вuse
(лямбда передается в качестве аргумента здесь). После того, как блок сделан, вы можете быть уверены, чтоFileInputStream
он был закрыт.источник
Изменить : Следующий ответ все еще действителен для Kotlin 1.0.x. Для Kotlin 1.1 существует поддержка стандартной библиотеки, предназначенной для Java 8, для поддержки шаблона закрываемых ресурсов.
Для других классов, которые не поддерживают функцию «use», я сделал следующую самодельную попытку с ресурсами:
Тогда вы можете использовать его следующим образом:
источник
try/finally
блокПоскольку этот пост в StackOverflow находится в верхней части текущих результатов поиска по запросу «пример закрывающегося котлина», и тем не менее ни один из других ответов (ни официальных документов) четко не объясняет, как его расширить
Closeable
(иначеjava.io.Closeable
), я решил добавить пример о том, как сделать свой собственный класс, который расширяетсяCloseable
. Это выглядит так:А потом использовать это:
Смотрите этот пример на игровой площадке Kotlin здесь .
источник