Cet article vous apporte une introduction détaillée à la gestion des exceptions Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Jetons un coup d'œil à un exemple et à quelques points de connaissances sur la gestion des exceptions Java (Exception Handling).
Regardez le programme ci-dessous. La méthode pleaseThrow accepte une instance d'Exception et lance simplement l'instance. Ensuite, lors de l’appel de cette méthode, j’ai transmis une instance de SQLException. Étant donné que l'appel à pleaseThrow est enveloppé dans un bloc try catch,
Question : l'exception SQL levée par la méthode pleaseThrow peut-elle être interceptée avec succès ?
public class ExceptionForQuiz<t> { private void pleaseThrow(final Exception t) throws T { throw (T) t; } public static void main(final String[] args) { try { new ExceptionForQuiz<runtimeexception>().pleaseThrow(new SQLException()); } catch( final SQLException ex){ System.out.println("Jerry print"); ex.printStackTrace(); } } }</runtimeexception></t>
Réponse : Le code ci-dessus contient une erreur de syntaxe et ne peut pas être compilé !
Analysons-le étape par étape.
La classe Java ExceptionForQuiz
Lorsque j'instancie la classe ExceptionForQuiz, le paramètre de type transmis est RuntimeException.
RuntimeException est une exception non vérifiée en Java. Même si une RuntimeException peut être levée lorsqu'une méthode est en cours d'exécution, les développeurs n'ont pas besoin de la déclarer explicitement dans le code avant la méthode.
Regardez les commentaires de JDK RuntimeException et c'est très clair : les exceptions non vérifiées n'ont PAS besoin d'être déclarées dans une clause de méthode ou de constructeur si elles peuvent être levées par l'exécution de la méthode ou du constructeur.
L'auteur Frank Yellin doit être un gars formidable.
Parce que les génériques sont un concept introduit dans Java 1.5, il existe un concept d'effacement de type pour les génériques, c'est-à-dire génériques L'information n'existe que dans la phase de compilation du code. Dans le code compilé, les informations liées aux génériques seront effacées. Par exemple, si la partie paramètre de type dans la classe générique précédente ne spécifie pas de limite supérieure, écrite ainsi
Par souci de simplicité, nous supprimons d'abord le bloc try catch dans le code.
Ce qui suit est le code décompilé de ExceptionForQuiz.class :
On peut observer sur la figure ci-dessus que le paramètre générique RuntimeException des méthodes pleaseThrow et ExceptionForQuiz a été effacé. Le type d'exception pouvant être généré par la méthode pleaseThrow a été effacé et devient Exception.
Utilisez javap pour observer le bytecode généré par la compilation, et vous pouvez également constater que le paramètre de type RuntimeException a été effacé :
Regardez la deuxième zone surlignée en rouge : Exceptions : lancez java .lang. Exception
Voyons maintenant quel message d'erreur le compilateur signalera : Bloc catch inaccessible pour SQLException Cette exception n'est jamais levée depuis le try. corps de la déclaration .
Ce message d'erreur est raisonnable compte tenu du fait que le type d'exception est effacé, puisque la déclaration de la méthode pleaseThrow ne peut désormais lancer que exceptions de type exception, donc le catch de la ligne 14 ne peut jamais recevoir d'exception de type SQLException, donc le compilateur renvoie une erreur.
Comment éliminer cette erreur du compilateur ? Remplacez simplement SQLException à la ligne 14 par RuntimeException.
Mais dans ce cas, bien que l'erreur de syntaxe soit éliminée, l'exception SQL levée par la méthode pleaseThrow ne peut pas être interceptée et une erreur d'exécution sera signalée :
Comment utiliser l'instruction catch pour intercepter l'exception SQL levée par pleaseThrow ? Remplacez RuntimeException à la ligne 14 par la superclasse de toutes les exceptions : Exception.
Exécutez à nouveau, cette fois il n'y a ni erreur de syntaxe ni erreur d'exécution : l'exception SQLException a été interceptée avec succès par l'instruction catch à la ligne 14.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!