La première fois que l' StackOverFlowError
se produit, l'appel à la dernière doAnything()
est annulée et le contrôle est retourné au bloc catch de la dernière doAnything()
.
Cependant, parce que la pile est encore pratiquement complet, le simple fait d'appeler System.out.print("y")
causerait un autre StackOverflowError
en raison de la nécessité de pousser une valeur sur la pile puis de faire un appel à la fonction print()
.
Par conséquent, un autre StackOverflowError
se produit à nouveau, et le retour est maintenant de retour sur le catch{} bloc de la précédente doAnything()
; où un autre StackOverflowError
va se produit parce que le besoin d'espace de pile nécessaire pour faire un seul appel à l' System.out.println("y")
est supérieure à la quantité d'espace libéré à partir de la réponse à l'appel d' doAnything()
.
Seulement quand il y aura assez d'espace sur la pile pour exécuter un appel à l' System.out.print("y")
que ce processus s'arrête et un bloc catch va réussir. Nous pouvons voir qu'en exécutant le morceau de code suivant:
public class Principal3b {
static int a = 0;
static int i = 0;
static int j = 0;
public static void main(String[] args) {
System.out.println("X");
doAnything();
System.out.println("Y");
System.out.println(i);
System.out.println(j);
}
private static void doAnything() {
a++;
int b = a;
try {
doAnything();
} catch (final Error e) {
i++;
System.out.println(a);
System.out.println(b);
j++;
}
}
}
Notez qu'un println(a)
est utilisé au lieu d'un print(a)
; par conséquent, une nouvelle ligne doit être imprimé après chaque valeur de a
si tout fonctionne OK.
Cependant, quand je le lance, j'obtiens le résultat suivant:
X
62066206620662066206620662066206
6190
Y
17
1
Cela signifie qu'il y a eu 17 tentatives ro exécuter le bloc catch. De ces bloc catch exécutions, 9 sont incapables d'imprimer quoi que ce soit avant de générer eux-mêmes un StackOverflowError; 7 sont en mesure d'imprimer la valeur de 6190, mais sont incapables de l'impression d'un retour à la ligne après l'avoir avant se levant de nouveau une erreur et, enfin, il en est un qui est capable à la fois d'imprimer la valeur de 6190 et le retour à la ligne après; c'est pourquoi, finalement, permettant à son bloc catch pour effectuer sans aucune nouvelle StackOverflowError et retour gracieusement jusqu'à la pile des appels.
Comme nous avons affaire à StackOverflowError, ces chiffres ne sont qu'un exemple et peut varier considérablement, non seulement entre les machines, mais aussi entre les exécutions et le simple fait de l'ajout ou de la suppression de tout type d'instructions doit également modifier ces valeurs. Cependant, le modèle vu ici reste le même.