2017-08-02 2 views
1

Quelqu'un peut-il expliquer comment fonctionne StackOverFlowError?Gestion de StackOverFlowError et récupération Java

Je sais qu'une récursion sans fin provoque StackOverFlowError, mais est-ce que toute autre méthode est exécutée une fois que la pile est pleine? J'ai géré l'erreur dans le bloc catch. Je voudrais savoir comment Java fonctionne ou récupère de l'erreur qui a été interceptée.

Exemple de code:

public class Test {  
    public static void main(String[] args) {  
     try { 
      show(); 
     } catch(StackOverflowError e) { 
      System.out.println(e); 
     }  
     System.out.println("After StackOverFlowError"); 

     display();  
    } 

    static void show() { 
     show(); 
    } 

    static void display() { 
     System.out.println("Hello New Function"); 
    }  
} 

Et la sortie est:

java.lang.StackOverflowError 

After StackOverFlowError 

Hello New Function 

+1

Généralement, vous ne récupérez pas de 'StackOverflowError', qui est une exception d'exécution. Si la récursion explose, c'est tout, corrigez votre code ou essayez de l'exécuter à nouveau dans des conditions différentes. –

+0

Je pense que vous n'avez pas compris la question. StackOverFlowError a été délibérément généré pour comprendre comment cela fonctionne et comment Java s'en remet. Ma question est de savoir si, après une récursion sans fin, la pile est pleine, techniquement, aucune autre méthode ne devrait être poussée dans cette pile, alors comment est-ce que display() est appelé? Est-ce que java s'en est remis? – Divyanshi

+1

Eh bien, vous avez attrapé l'exception, êtes-vous surpris par quelque chose? La récursivité est toujours morte, et si vous attendiez un résultat, vous ne l'auriez probablement pas. En règle générale, vous ne pouvez pas capturer une exception non contrôlée comme 'StackOverflowError' en pratique. –

Répondre

1

Oui, Java récupéré de lui. Lorsque le StackOverflowError est lancé, il déroule la pile à travers toutes les méthodes show() jusqu'à ce qu'il revienne à votre bloc catch. À ce stade, seul le main() reste sur la pile et vous pouvez continuer à exécuter votre programme sans problème.

Votre pile d'appel ressemblera:

main() 
    show() 
     show() 
     show()... 

Cependant la mémoire profonde de votre pile permet d'aller, lorsque le dernier show() méthode obtient l'exception qu'elle le jette à chaque méthode show qui re-thorws il jusqu'à ce qu'il atteigne le bloc catch dans votre main et l'erreur est imprimée.

+0

Merci pour l'explication. – Divyanshi

0

Comme Tim a dit, vous ne gérez pas StackOverflowError, au lieu s'il est possible essayez une meilleure approche comme itération ou terminez la pile d'appels après plusieurs appels.

+0

Je pense que vous n'avez pas compris la question. StackOverFlowError a été délibérément généré pour comprendre comment cela fonctionne et comment Java s'en remet. Ma question est de savoir si, après une récursion sans fin, la pile est pleine, techniquement, aucune autre méthode ne devrait être poussée dans cette pile, alors comment est-ce que display() est appelé? Est-ce que java s'en est remis? – Divyanshi

+0

oh, bien sûr, il va récupérer tant que vous avez attrapé l'erreur dans le fil en cours d'exécution, comme indiqué par votre extrait. Si vous laissez l'erreur être renvoyée vers les appels les plus élevés, le thread d'application/en cours d'exécution se terminera (exit système) car il a reçu l'erreur et personne ne la gère. –