Le contenu de cet article explique comment utiliser JVM pour intercepter les exceptions Java ? (Avec des exemples), il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
1. Deux facteurs clés des exceptions
(1) Lancement d'exceptions
1 Explicite : l'application lève manuellement des exceptions. Plus précisément, utilisez throw pour lever une exception
2. Implicite : la machine virtuelle Java lève automatiquement une exception
pour le code qui ne peut pas être exécuté (recommandé : Tutoriel Java)
(2) Capture des exceptions
1.try code block : utilisé pour marquer le code qui nécessite une surveillance des exceptions.
2.catch code block : suivant le bloc de code try, utilisé pour intercepter un type spécifié d'exception déclenché dans le bloc de code try. En plus de déclarer le type d'exception interceptée, le bloc catch définit également un gestionnaire d'exception pour ce type d'exception. En Java, un bloc de code try peut être suivi de plusieurs blocs de code catch pour intercepter différents types d'exceptions. La machine virtuelle Java correspond aux gestionnaires d'exceptions de haut en bas. Par conséquent, le type d'exception capturé par le bloc de code catch précédent ne peut pas couvrir le suivant, sinon le compilateur signalera une erreur.
3.finalement bloc de code : Suite au bloc de code try et au bloc de code catch, il permet de déclarer un morceau de code qui doit être exécuté. Il est conçu pour éviter de sauter certains codes de nettoyage critiques, tels que la fermeture des ressources du système ouvert. Dans le cadre d'une exécution normale du programme, ce code s'exécutera après le bloc try. Sinon, c'est-à-dire que lorsque le bloc de code try déclenche une exception, si l'exception n'est pas interceptée, le bloc de code final s'exécutera directement et renverra l'exception après son exécution. Si l'exception est interceptée par un bloc catch, le bloc final est exécuté après le bloc catch. Dans certaines circonstances malheureuses, le bloc catch déclenche également une exception, puis le bloc fnally s'exécutera également et lancera l'exception déclenchée par le bloc catch. Dans certaines circonstances extrêmement malheureuses, le bloc de code fnally déclenche également une exception, vous devez donc interrompre l'exécution du bloc de code fnally actuel et lever l'exception.
2. Classification des exceptions
1 La classe parent de toutes les exceptions est Throwable
2. L'état d'exécution du programme ne peut pas être restauré et l'exception ne peut que mettre fin au thread ou même à la JVM
3.Exception est une exception moins grave que Error
4.Runtime Exception et Error sont des exceptions qui n'ont pas besoin à vérifier
5. À l'exception des exceptions d'exécution et des erreurs, les exceptions sont toutes des exceptions de vérification d'exception
6. Les exceptions de vérification d'exception sont des exceptions qui doivent être explicitement détectées
Il est très coûteux pour la machine virtuelle Java de créer des instances d'exception. La machine virtuelle doit générer une trace de pile de l'exception. Cette opération accédera un par un aux cadres de pile Java du thread actuel et enregistrera diverses informations de débogage, notamment le nom de la méthode pointée par le cadre de pile, le nom de classe et le nom de fichier de la méthode, ainsi que la ligne dans le code. où l'exception a été déclenchée.
Étant donné que la construction d'instances d'exception est très coûteuse, pouvons-nous mettre en cache les instances d'exception et les lancer directement en cas de besoin ? D'un point de vue grammatical, cela est autorisé. Cependant, la trace de pile correspondant à cette exception n'est pas l'emplacement de l'instruction throw, mais l'emplacement de la nouvelle exception.
Par conséquent, cette approche peut inciter les développeurs à cibler le mauvais emplacement. C'est pourquoi, dans la pratique, nous choisissons souvent de lancer de nouvelles instances d'exception.
Gestionnaire d'exceptions
1. Source : Chaque méthode générera une table d'exceptions lors de la compilation. Chaque entrée de la table d'exceptions représente un gestionnaire d'exceptions.
2. Composition :
(1) du pointeur au pointeur : représente la portée de la capture des exceptions, qui est la portée de Try.
(2)pointeur cible : représente la position de départ du processeur, qui est la position de départ de la capture.
(3)Type d'exception détecté.
3. Capturer les exceptions
(1) Lorsque le programme déclenche une exception, la machine virtuelle Java parcourt toutes les entrées de la table des exceptions de haut en bas. Lorsque la valeur d'index du bytecode qui déclenche l'exception se trouve dans la plage de surveillance d'une entrée de table d'exceptions, la machine virtuelle Java détermine si l'exception levée correspond à l'exception que l'entrée souhaite intercepter. S'il y a une correspondance, la machine virtuelle Java transfère le flux de contrôle vers le bytecode pointé par le pointeur cible de l'entrée.
(2) Si toutes les entrées de la table d'exceptions sont parcourues et que la machine virtuelle Java ne correspond toujours pas à un gestionnaire d'exceptions, elle affichera le cadre de pile Java correspondant à la méthode actuelle et répétera les opérations ci-dessus dans l'appelant. Dans le pire des cas, la machine virtuelle Java doit parcourir la table d'exceptions de toutes les méthodes de la pile Java du thread actuel.
4. Compilation du code final : La version actuelle du compilateur Java copie le contenu du bloc de code fnally et le place dans les sorties de tous les chemins d'exécution normaux et chemins d'exécution anormaux du bloc de code try-catch.
代码1: Try{ Try block } catch { Catch block } finally { Finally block }
代码2: Try { Try block Finally block } catch { Catch block Finally block } finally{ Finally block }
Le code 1 est notre code Java, le code 2 est le code Java compilé.Remarque : si le bloc catch intercepte une exception et déclenche une autre exception, quelle exception sera finalement interceptée et renvoyée ? La réponse est la dernière. En d’autres termes, l’exception d’origine sera ignorée, ce qui est très préjudiciable au débogage du code.
Au vu de la section ci-dessus qui ignorera les exceptions catch, Java7 a introduit le problème de la gestion des exceptions supprimées. Mais c'est quand même très gênant à utiliser (aucune expérience,
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!