Kotlin From Scratch Gestion des exceptions

Kotlin est un langage de programmation moderne qui compile en bytecode Java. C'est gratuit et open source, et rend le codage pour Android encore plus amusant.  

Dans l'article précédent, vous en apprendrez plus sur la programmation orientée objet en creusant dans les classes abstraites, les interfaces, l'héritage et les alias de types dans Kotlin. 

Dans cet article, vous allez continuer à apprendre la programmation dans Kotlin en apprenant sur les exceptions et sur la façon de les gérer.. 

1. Traitement des exceptions

Les exceptions sont utilisées pour indiquer un problème dans notre code lors de l'exécution d'un programme. La gestion des exceptions est la capacité de traiter (ou de gérer) l'exception qui pourrait survenir. Si nous ne gérons pas les exceptions qui se produisent, notre programme arrêtera immédiatement l'exécution de notre application.. 

La gestion des exceptions permet à notre programme de continuer l'exécution même s'il y avait une exception (bien qu'il soit vivement recommandé de consigner vos exceptions et de les signaler à l'aide d'un outil de génération de rapports d'incident tel que Crashlytics)..   

En Java, nous avons deux types d'exceptions: cochée et non cochée. Je vais expliquer brièvement les deux, mais nous commencerons par des exceptions non contrôlées.. 

Exceptions non contrôlées

Ce sont des exceptions qui sont levées à cause de failles dans votre code. Ils constituent une sous-classe directe ou indirecte du RuntimeException super classe. 

Voici des exemples d'exceptions non contrôlées:

  • ArithmeticException: jeté quand on divise par zéro.
  • ArrayIndexOutOfBoundExceptions: levé quand on a accédé à un tableau avec un index illégal. 
  • Exception de sécurité: levé par le responsable de la sécurité pour indiquer une violation de la sécurité.
  • NullPointerException: levé lors de l'appel d'une méthode ou d'une propriété sur un objet null.

Une méthode qui peut générer une exception non vérifiée ne contient aucune information sur l'exception levée sur sa déclaration de méthode. 

public Integer divideByZero (numérateur entier, dénominateur entier) retour numérateur / dénominateur;  divideByZero (7, 0) // lève une exception arithmétique

Ce type d’exception peut être évité en codant correctement. Dans le code ci-dessus, nous aurions dû vérifier si le dénominateur était zéro avant d'effectuer l'opération. Pour ces exceptions, le développeur n'a pas besoin d'intercepter l'exception à l'aide de la commande essayer… attraper bloc. En d'autres termes, le compilateur ne nous oblige pas à envelopper le code qui pourrait déclencher l'exception dans un essayer… attraper bloc. Au lieu de cela, nous devrions simplement nous assurer que les exceptions ne se produisent jamais..

De plus, rappelez-vous que le kotlin est une langue totalement sûre. En d’autres termes, cela peut nous aider à éviter d’être NullPointerExceptions dans notre code. Vous pouvez lire les publications Nullability, Loops et Conditions pour obtenir un rappel sur la sécurité des valeurs null dans Kotlin.. 

Exceptions vérifiées en Java

Une méthode qui peut générer une exception vérifiée doit le déclarer dans sa signature de méthode à l'aide de jette mot-clé. Si vous appelez une méthode qui lève une exception vérifiée, vous devez soit la renvoyer de votre fonction, soit l'attraper et la gérer à l'aide d'un script. essayer… attraper bloc. 

Les exceptions cochées sont des exceptions vérifiées lors de la compilation. Ces types d’exceptions héritent de la Exception classe. Un exemple de ce type d’exception est IOException. Cela peut se produire lorsque vous essayez d'accéder à un fichier qui ne peut pas être ouvert car il n'existe pas. (FileNotFoundException est une sous-classe de IOException.)

// effectuer dans un thread d'arrière-plan public void editFile (File, String text) try file.getParentFile (). mkdirs (); FileOutputStream fileOutputStream = new FileOutputStream (fichier); Writer writer = new BufferedWriter (new OutputStreamWriter (fileOutputStream)); essayez writer.write (text); writer.flush (); fileOutputStream.getFD (). sync ();  finally writer.close ();  catch (IOException e) // Journalise l'exception e.printStackTrace (); 

Dans le code précédent, nous avons utilisé un essayer… attraper bloquer pour gérer le IOException à l'intérieur de editFile () méthode. Nous pouvons maintenant appeler le editFile () méthode comme d'habitude, et le compilateur ne va pas se plaindre. 

editFile (nouveau fichier (""), "mon texte");

En regardant le code ci-dessous, nous avons refactored la méthode pour utiliser plutôt le jette mot-clé dans la signature de la méthode. Cela indique aux appelants qu'ils doivent gérer l'exception. IOException cela pourrait être jeté lors de l'appel de la méthode editFile ().

// ceci devrait être dans un thread d'arrière-plan public void editFile (File File, String text) lève IOException file.getParentFile (). mkdirs (); FileOutputStream fileOutputStream = new FileOutputStream (fichier); Writer writer = new BufferedWriter (new OutputStreamWriter (fileOutputStream)); essayez writer.write (text); writer.flush (); fileOutputStream.getFD (). sync ();  finally writer.close (); 

Pour appeler la méthode ci-dessus, nous devons l’entourer d’une essayer… attraper bloquer pour gérer l'exception.

try editFile (nouveau fichier (""), "mon texte");  catch (IOException e) e.printStackTrace (); 

Cela a été un bref aperçu des exceptions en Java. Voyons maintenant comment Kotlin gère les exceptions. 

2. Exceptions à Kotlin

La principale différence entre les mécanismes d’exception Kotlin et Java est que toutes les exceptions ne sont pas contrôlées dans Kotlin. En d'autres termes, elles ne sont pas explicitement déclarées dans les signatures de fonctions, comme elles le sont en Java..

fun editFile (fichier: fichier, texte: chaîne) file.parentFile.mkdirs () val fileOutputStream = FileOutputStream (fichier) val writer = BufferedWriter (OutputStreamWriter (fileOutputStream)) try writer.write (text) writer.flush () fileOutputStream) .fd.sync () enfin writer.close ()

Ici, nous avons converti le editFile () méthode à une fonction de Kotlin. Vous pouvez voir que la fonction n'a pas le jette IOException déclaration dans sa signature de fonction. jette n'est même pas un mot clé à Kotlin. 

En outre, nous pouvons appeler cette fonction sans l’entourer de la essayer… attraper bloc-et le compilateur ne se plaindra pas. En d'autres termes, les exceptions vérifiées dans Kotlin n'existent pas. Toutes les exceptions sont décochées. (Notez que si une exception est levée, l'exécution du programme s'arrête normalement.) 

Si nous pensons que cette exception pourrait survenir, nous devrions tout de même y remédier en entourant la méthode d’un essayer… attraper block-mais ceci n'est pas imposé par le compilateur Kotlin. 

try editFile (File (""), "texte 123") catch (e: IOException) e.printStackTrace ()

Si l'exception levée à l'intérieur du editFile () fonction est une instance du IOException classe, notre capture bloc sera exécuté, et nous imprimons simplement la trace de la pile à des fins de débogage.

le essayer… attraper Bloc

le essayer construire avec capture et enfin les clauses de Kotlin sont similaires à celles de Java. 

fun foo () try throw Exception ("Message d'exception") catch (e: Exception) println ("Exception traitée") finally println ("inside finally block")

Ici, nous lançons un Exception objet à l'intérieur du essayer bloc. Notez que nous n'avons pas inclus le Nouveau comme nous le faisons en Java pour créer une nouvelle instance. Notez également que nous n’avons pas spécifié l’exception qui sera générée dans la signature de la fonction comme il le faudrait en Java.. 

Nous traitons toutes les sous-classes et classes de type Exception dans le bloc de capture. L'option enfin le bloc est toujours exécuté - c'est ici que nous fermons généralement toutes les ressources ou connexions précédemment ouvertes afin d'éviter les fuites de ressources. Par exemple, si vous ouvrez un fichier ou créez une base de données ou une connexion réseau dans un répertoire. essayer bloquer, vous devez le fermer ou le libérer dans un enfin bloc. 

Notez que dans Kotlin le jeter construct est une expression et peut se combiner avec d'autres expressions.

val letter = 'c' val result = if (lettre dans 'a'… 'z') lettre sinon lance IllegalArgumentException ("Une lettre doit être comprise entre a et z") 

Également essayer construct peut être utilisé comme expression.

fun foo (nombre: Int) val result = try if (nombre! = 1) jette IllegalArgumentException () true catch (e: IllegalArgumentException) false println (résultat) foo (2) // false

Ici, nous avons attribué la valeur renvoyée par le essayer… attraper bloquer à la résultat variable. Si le nombre n'est pas 1, il jette un Exception d'argument illégal et le capture le bloc est exécuté. le faux expression dans le capture la valeur de blocage sera attribuée à la résultat variable. Si le nombre est 1 à la place, le vrai la valeur d'expression sera assignée à la résultat variable.

Java Interop

Les exceptions dans Kotlin se comportent normalement en Java, mais je tiens à vous informer d'une annotation utile appelée @Throws à Kotlin, cela pourrait être utile. Comme toutes les exceptions dans Kotlin sont décochées, les développeurs qui utilisent votre code Kotlin à partir de Java peuvent ne pas savoir que leurs fonctions génèrent des exceptions. Cependant, vous pouvez toujours ajouter les exceptions possibles pouvant être émises à une signature de méthode avec le paramètre @Jeter annotation. Cela alertera les appelants Java qu'ils doivent gérer l'exception.. 

Voyons un exemple pratique de cette annotation.

/ * Fichier Functions.kt * / fun addNumberToTwo (a: Any): Int if (a! Est Int) jette IllegalArgumentException ("Le nombre doit être un entier") return 2 + a

Ici, nous avons défini une fonction Kotlin pouvant générer une exception Exception d'argument illégal seulement si le type passé à la fonction n'est pas de type Int

Nous appelons cette fonction de niveau supérieur addNumberToTwo () directement à partir de Java de la manière suivante:

public void myJavaMethod () Integer result = FunctionsKt.addNumberToTwo (5); System.out.println (résultat); // 7 

Cela fonctionne bien. le compilateur ne se plaint pas. Cependant, si nous voulons communiquer avec les appelants Java, le addNumberToTwo () fonction de niveau supérieur lève une exception, nous ajoutons simplement le @Throws annotation à la signature de fonction. 

@Throws (IllegalArgumentException :: class) fun addNumberToTwo (a: Any): Int if (a! Est Int) jette IllegalArgumentException ("Le nombre doit être un entier") return 2 + a

Ce @Throws Une annotation peut accepter une liste d'arguments de classes d'exceptions, séparés par des virgules. Dans le code ci-dessus, nous venons d'inclure une classe d'exception-Exception d'argument illégal

Maintenant, nous devons mettre à jour notre code Java pour gérer l'exception.

public void myJavaMethod () lève IllegalArgumentException Integer result = FunctionsKt.addNumberToTwo (5); System.out.println (résultat); 

Si on décompile le Kotlin addNumberToTwo () fonction, en utilisant le Afficher le bytecode de Kotlin fonction (si vous utilisez IntelliJ IDEA ou Android Studio, utilisez Outils > Kotlin Afficher le bytecode de Kotlin), nous verrons le code Java suivant:

//… public static final int addNumberToTwo (@NotNull Object a) lève IllegalArgumentException Intrinsics.checkParameterIsNotNull (a, "a"); if (! (une instance de Integer)) throw (Throwable) (new IllegalArgumentException ("Le nombre doit être un entier"));  else return 2 + ((Number) a) .intValue ();  //… 

Dans le code Java généré ci-dessus (certains éléments du code généré ont été supprimés pour des raisons de brièveté), vous pouvez voir que le compilateur a ajouté le jette mot-clé à la signature de la méthode, car nous avons inclus le @Throws annotation. 

Conclusion

Dans ce tutoriel, vous avez appris davantage sur la programmation dans Kotlin en examinant les exceptions. Nous avons vu que Kotlin n'a pas d'exceptions vérifiées, mais que toutes les exceptions ne sont pas vérifiées. Nous avons également examiné comment gérer les exceptions à l'aide du essayer… attraper bloquer et a vu l'utilité de la @Throws annotation dans Kotlin pour les appelants Java. 

Pour en savoir plus sur la langue Kotlin, je vous recommande de consulter la documentation Kotlin. Ou consultez certains de nos autres articles sur le développement d'applications Android ici sur Envato Tuts!