Essayer est comme un réseau, qui réalise toutes les exceptions lancées par le code dans TRY {}, puis remet les exceptions au code dans Catch {} pour le traitement. Exécutez enfin le code dans enfin. Peu importe s'il y a des exceptions dans le code dans l'essai, et si le capture Catch attrape l'exception, le code est finalement exécuté.
Bien que les processeurs prédéfinis fournis par Java Execution Période Systems soient utiles pour le débogage, vous souhaitez généralement gérer vous-même des exceptions. Il y a deux avantages à procéder: d'abord, il vous permet de corriger les erreurs. Deuxièmement, il peut empêcher le programme de terminer automatiquement. Chaque fois qu'une erreur se produit, si votre programme s'arrête et imprime une piste de pile, la plupart des utilisateurs seront confus. Heureusement, vous pouvez facilement éviter cette situation.
Pour se méfier et gérer les erreurs de période d'exécution, il suffit de mettre le code que vous souhaitez surveiller dans le bloc d'essai. Immédiatement après le bloc d'essai, spécifiez l'exemple de capture d'erreur de modèle d'exception que vous souhaitez prendre dans la clause Catch:
essayez {code; // mettez votre propre code;
Par exemple:
Importer java.io. *; // appelant le package IO classe publique SimpleCHarinout {public static void main (String args []) {char ch = ''; // définissant un caractère ch comme 'System.out.prin tln (" Entrez un personnage s'il vous plaît "); // Ouvrez entrez un personnage s'il vous plaît essayez sur l'écran {// Veuillez mettre le code du programme que vous souhaitez surveiller dans le bloc d'essayer. Immédiatement après le bloc d'essai, spécifiez le modèle d'exception que vous souhaitez capturer dans la clause Catch CH = (char) System.in.read (); // Attribuez les caractères entrés du clavier à Ch} Catch (ioException E) // S'il y a une erreur dans le code ci-dessus, vous attraperez {} ici; // aucune opération après le système d'erreur.out.println ("vous êtes entré le caractère:" + ch); // Le caractère de l'écran: // et la valeur de Ch}}
Lorsque nous écrivons Java Try..catch, nous devons souvent ajouter des clauses finalement pour fermer certaines ressources IO, par exemple
InputStream est; try {is = openInputStream (); }}
Mais lors de l'utilisation de ce modèle, même les vétérans de Java font parfois des erreurs. Par exemple, dans le code ci-dessus, lorsque la fonction OpenInputStream () lance une exception pendant l'exécution, la valeur de la variable est toujours nul. Par conséquent, il ne peut pas être capturé par le bloc de capture, mais est directement jeté à la couche d'appel. Je pense personnellement que la manière la plus élégante d'écriture est d'appeler directement la méthode ioutils.closequily () fournie par le package Commons-io pour fermer vous-même le flux (ou encapsuler une méthode clos ()).
Il existe un autre avantage de l'utilisation de cette méthode d'écriture, à savoir qu'il n'est pas facile de faire des erreurs lors de la fermeture de plusieurs ressources IO, telles que le code suivant:
InputStream est; OutputStream OS; try {is = openInputStream (); if (os! = null) os.close ();} catch (ioException e) {}}
Lorsqu'une erreur se produit dans IS.Close (), OS.Close () ne peut pas être exécutée, ce qui entraîne la référence de la ressource par le système d'exploitation.
Peut-être que Oracle pense également que ce genre d'essai ... Catch ... enfin le code de la buissier de chauffeur n'est pas trop nécessaire, j'ai donc apporté quelques modifications à la clause d'essai dans JDK 7, éliminant l'écriture d'un code qui ferme manuellement les ressources, ce qui fait le code Regardez plus compact et plus simple. Par exemple, le code ci-dessus peut être modifié en:
try (inputStream is = openInputStream (); outputStream os = openoutStream ();) {// faire quelque chose} catch (ioException e) {e.printStaceTrace (e);}
Oracle appelle l'instruction TRY (..) ici l'instruction TRY-WITH-RESOURCE. Il convient de noter que les objets référencés par des variables dans TRY (..) doivent être des instances qui implémentent l'interface java.io.autalable. C'est-à-dire que les ressources dans les instructions TRYS-With-Resource ne se limitent pas aux ressources IO.
Ici, il est nécessaire de fournir quelques explications supplémentaires pour certains détails de l'énoncé d'essai avec les ressources:
JDK garantit que la méthode close () de toutes les ressources est appelée que la méthode close () lance une exception, et l'ordre de l'appel est inversé à partir de l'ordre de la déclaration de ressources.
Toutes les exceptions lancées dans la déclaration TRY-With-Resource seront prises. Si plusieurs exceptions sont lancées, l'exception suivante sera supprimée. L'exception supprimée peut être obtenue en appelant GetSupressed () défini par la classe jetable tour à tour.
L'exemple ci-dessus,
Lors de la sortie de l'essai .. Catch. Dans l'exception lancée par os.close (). Vous pouvez obtenir l'exception lancée par IS.Close () via la méthode getSuppress ().
Si une IOException se produit lorsque OpenInputStream () est appelé, alors OpenOutputStream () ne sera pas appelé, OS.Close () et IS.Close () ne sera pas appelé, et le bloc de capture attrape le lanceur lorsque vous appelez OpenInputStream () Exception.
Si une IOException se produit (indiqué par le jeton E1), alors est.close () sera toujours appelé. L'exception prise par le bloc de capture est E1.
En plus de remodeler le bloc d'essai, JDK 7 simplifie également la partie de capture, permettant à plusieurs clauses de capture de fusion. Par exemple:
try (inputStream is = openInputStream (); outputStream os = openoutStream ();) {// faire quelque chose} catch (ioException | xmlparseException | xpathException e) {e.printStaceTrace (e);}
De plus, lorsque vous retweetez plusieurs exceptions, vous n'avez plus besoin de définir le type d'exception en détail. Il vous suffit de déclarer l'exception qui doit être lancée lorsque la méthode est définie. Par exemple
// Bien que l'exception soit utilisée ici pour faire correspondre la IOException lancée, le compilateur sait que l'exception lancée en réalité à la couche supérieure est ioException publique void DOIO () lance ioException {try {lancez new ioException ();} CATC H (exception E ) {lancer e;}}
PS: Je ne peux penser à aucun avantage que cette fonctionnalité apportera
JDK 7 a d'autres nouvelles fonctionnalités de syntaxe intéressantes, telles que les littéraux binaires, la segmentation de longs nombres avec des sous-oreurs, l'inférence de type des paramètres génériques, le commutateur prend en charge la correspondance des chaînes, etc. Maintenant, JDK 8 a introduit certaines fonctionnalités utiles. Sans considérer la compatibilité vers l'arrière, l'application appropriée et de manière flexible de certaines fonctionnalités de syntaxe peut rendre notre code plus clair et plus concis dans une certaine mesure.