Java: comment éviter StackOverflowException
Je suis en train d'écrire une fonction qui va s'appeler lui-même jusqu'à près de 5000 fois. Bien sûr, je reçois un StackOverflowException. Est-il possible que je peux réécrire ce code dans une manière assez simple?:
void checkBlocks(Block b, int amm) {
//Stuff that might issue a return call
Block blockDown = (Block) b.getRelative(BlockFace.DOWN);
if (condition)
checkBlocks(blockDown, amm);
Block blockUp = (Block) b.getRelative(BlockFace.UP);
if (condition)
checkBlocks(blockUp, amm);
//Same code 4 more times for each side
}
En passant, qu'est-ce que la limitation de la profondeur qu'on peut appeler les fonctions?
Merci!
source d'informationauteur Henrik Karlsson
Vous devez vous connecter pour publier un commentaire.
Peut-être à l'aide d'une pile?
taille de pile par défaut en java est de 512 ko. si vous dépassez ce programme prendra fin en jetant StackOverflowException
vous pouvez augmenter la taille de la pile par le passage d'un argument JVM :
-Xss1024k
maintenant la taille de la pile est de 1024 kb. vous pouvez donner une plus grande valeur en fonction de votre environnement
Je ne pense pas que l'on peut modifier par programme cette
Vous pouvez augmenter la taille de la pile en utilisant-Xss4m.
Vous pouvez mettre votre "Bloc"s dans une file d'attente/de la pile et l'itération tant que Blocs sont disponibles.
Il est évident que vous obtenez StackOverflow avec un tel facteur de branchement de votre récursivité. Dans d'autres langues, il peut être réalisé par Queue d'Appel d'Optimisation. Mais je suppose que votre problème nécessite une autre façon de résoudre.
Idéalement, vous effectuez une vérification sur le Bloc. Peut-être que vous pouvez obtenir la liste de tous les blocs et vérifier chacun d'eux de manière itérative?
Dans la plupart des cas, la récursivité est utilisé de manière incorrecte. Vous ne devriez pas obtenir une pile de flux d'exception.
Votre méthode n'a pas de type de retour/valeur.
Comment vous assurer que votre premier Bloc b est valide?
Si vous êtes en utilisant la récursivité, répondez-vous la question suivante:
Exemple:
mon récursivité d'ancrage est n == 2 (résultat 2), afin que je puisse calculer tous les résultats beginnging à partir de ce point d'ancrage.
mon récursivité à l'étape n-1 (de sorte que chaque étape je me suis rapproché de la solution (ce qui fait à mon récursivité d'ancrage))