Comme cela a déjà été répondu , il est possible d'exécuter du code, et en particulier d'appeler des fonctions, après avoir attrapé un StackOverflowError
car la procédure normale de gestion des exceptions de la JVM déroule la pile entre throw
les catch
points et, libérant de l'espace de pile à utiliser. Et votre expérience confirme que c'est le cas.
Cependant, ce n'est pas tout à fait la même chose que de dire qu'il est, en général, possible de récupérer d'un fichierStackOverflowError
.
Un StackOverflowError
IS-A VirtualMachineError
, qui IS-AN Error
. Comme vous le faites remarquer, Java fournit quelques conseils vagues pour Error
:
indique des problèmes graves qu'une application raisonnable ne devrait pas essayer d'attraper
et vous, raisonnablement, concluez que cela devrait ressembler à attraper un Error
pourrait être OK dans certaines circonstances. Notez que la réalisation d'une expérience ne démontre pas que quelque chose est, en général, sûr à faire. Seules les règles du langage Java et les spécifications des classes que vous utilisez peuvent le faire. A VirtualMachineError
est une classe spéciale d'exception, car la spécification du langage Java et la spécification de la machine virtuelle Java fournissent des informations sur la sémantique de cette exception. En particulier, ce dernier dit :
Une implémentation de machine virtuelle Java renvoie un objet qui est une instance d'une sous-classe de la classe VirtualMethodError
lorsqu'une erreur interne ou une limitation de ressources l'empêche d'implémenter la sémantique décrite dans ce chapitre. Cette spécification ne peut pas prédire où des erreurs internes ou des limitations de ressources peuvent être rencontrées et ne précise pas quand elles peuvent être signalées. Ainsi, l'une des VirtualMethodError
sous - classes définies ci-dessous peut être lancée à tout moment pendant le fonctionnement de la machine virtuelle Java:
...
StackOverflowError
: L'implémentation de la machine virtuelle Java n'a plus d'espace de pile pour un thread, généralement parce que le thread effectue un nombre illimité d'appels récursifs suite à une erreur dans le programme en cours d'exécution.
Le problème crucial est que vous «ne pouvez pas prédire» où et quand un StackOverflowError
sera lancé. Il n'y a aucune garantie sur l'endroit où il ne sera pas lancé. Vous ne pouvez pas vous fier à ce qu'il soit lancé à l' entrée d'une méthode, par exemple. Il peut être jeté à un point dans une méthode.
Cette imprévisibilité est potentiellement désastreuse. Comme elle peut être lancée dans une méthode, elle pourrait être lancée à mi-chemin d'une séquence d'opérations que la classe considère comme une opération "atomique", laissant l'objet dans un état partiellement modifié et incohérent. Avec l'objet dans un état incohérent, toute tentative d'utilisation de cet objet peut entraîner un comportement erroné. Dans tous les cas pratiques, vous ne pouvez pas savoir quel objet est dans un état incohérent, vous devez donc supposer qu'aucun objet n'est digne de confiance. Toute opération de récupération ou tentative de poursuite après que l'exception est interceptée peut donc avoir un comportement erroné. La seule chose sûre à faire est donc de ne pas attraper unStackOverflowError
, mais plutôt pour permettre au programme de se terminer. (En pratique, vous pouvez essayer de faire une journalisation des erreurs pour aider au dépannage, mais vous ne pouvez pas compter sur cette journalisation fonctionnant correctement). Autrement dit, vous ne pouvez pas récupérer de manière fiable à partir d'un fichierStackOverflowError
.