5

je reçois un StackOverflowException sur cette méthode Java:Je reçois une exception StackOverFlowException sur ce code car ma machine virtuelle Java ne prend pas en charge l'optimisation de l'appel de la queue, n'est-ce pas?

private static final Integer[] populate(final Integer[] array, final int length, final int current) { 

    if (current == length) { 
     return array; 
    } else { 
     array[current] = TR.random.nextInt(); 
     System.out.println(array[current]); 
     return populate(array, length, current + 1); 
    } 
} 

Je joue avec récursion appel queue donc je suppose que ce qui se passe quand la machine virtuelle Java ne court-circuite le droit de la pile?

Répondre

7

Aucune JVM à ma connaissance ne prend en charge l'optimisation des appels de fin. Ce n'est pas un oubli. Apparemment, cette optimisation a des conséquences importantes pour les gestionnaires de réflexion Java et de sécurité Java.

Références:

1

J'ai trouvé un reference of tail recursion en Java, donc je voudrais vérifier cela, (plus tard quand j'ai le temps).

Bien qu'il soit extrêmement inefficace pour votre cas d'utilisation.

+0

Je ne pense pas que le document ajoute beaucoup ... la référence à la récursion de queue ne mentionne pas si les références de la pile sont optimisées – Eddy

3

Oui, la queue d'appel d'optimisation n'est pas actuellement pris en charge par la machine virtuelle Java en raison du modèle de sécurité et la nécessité d'avoir toujours une trace de la pile disponible, cet exemple pourrait facilement être réécrite en utilisant l'itération bien.

+0

Salut, bien sûr, ça peut être facilement exprimé avec une boucle for ... c'est un exercice après tout;) – Eddy