Essayez-avec-des ressources en Kotlin
Quand j'ai essayé d'écrire un équivalent de Java try
-avec-code des ressources en Kotlin, il ne fonctionne pas pour moi.
J'ai essayé différentes variantes de la suivante:
try (writer = OutputStreamWriter(r.getOutputStream())) {
//...
}
Mais aucun ne fonctionne.
Personne ne sait ce qui doit être utilisé à la place?
Apparemment Kotlin grammaire n'a pas de définition pour une telle construction, mais peut-être que je suis absent quelque chose. Il définit la grammaire pour essayer de bloquer comme suit:
try : "try" block catchBlock* finallyBlock?;
Vous devez vous connecter pour publier un commentaire.
Il est
use
fonction de kotlin stdlib (src).Comment l'utiliser:
OutputStreamWriter
ainsi:r.outputStream.writer.use { ... }
use
extension: kotlinlang.org/docs/reference/...FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL;DR
Pas de syntaxe particulière, mais
use
fonctionKotlin, contrairement à Java, n'a pas une syntaxe spéciale pour cela. Au lieu de cela, try-with-resources, est proposé en standard fonction de la bibliothèque
use
.La
use
mise en œuvreCette fonction est définie comme une extension générique sur tous les
Closeable?
types.Closeable
est de Java interface qui permet try-with-resources de Java SE7.La fonction prend une fonction littérale
block
qui est exécuté dans untry
. Même avec try-with-resources en Java, leCloseable
obtient fermé dans unfinally
.Aussi des échecs qui se passe à l'intérieur de
block
conduire àclose
exécutions, où les exceptions possibles sont littéralement "supprimée" par juste de les ignorer. Ce est différente de try-with-resources, parce que de telles exceptions peuvent être demandés à l' Java‘s solution.Comment l'utiliser
La
use
extension est disponible sur n'importe quelCloseable
type, c'est à dire les ruisseaux, les lecteurs et ainsi de suite.La partie entre accolades est ce que devient
block
dansuse
(un lambda est passé comme argument ici). Après le bloc est fait, vous pouvez être sûr queFileInputStream
a été fermé.Modifier: La réponse suivante est encore valable pour Kotlin 1.0.x. Pour Kotlin 1.1, il ya un soutien, une bibliothèque standard qui cible Java 8 pour soutenir les caisses de la ressource de modèle.
Pour les autres classes qui ne prennent pas en charge l'utilisation de la fonction, j'ai fait la suite de maison try-with-resources:
Ensuite, vous pouvez l'utiliser de la manière suivante:
try/finally
bloc