Quelles sont les causes d’une erreur java.lang.StackOverflowEr

Qu’est-ce qui peut causer une java.lang.StackOverflowError ? L’impression de stack que j’obtiens n’est pas très profonde du tout (seulement 5 méthodes).

Vérifiez les appels de récusation pour les méthodes. Cela est principalement dû à un appel récursif pour une méthode. Un exemple simple est

 public static void main(Ssortingng... args) { Main main = new Main(); main.testMethod(1); } public void testMethod(int i) { testMethod(i); System.out.println(i); } 

Ici, le System.out.println (i); sera poussé à plusieurs resockets à la stack lorsque la méthode testMethod est appelée.

L’un des arguments (facultatifs) de la machine virtuelle Java est la taille de la stack. C’est -Xss. Je ne sais pas quelle est la valeur par défaut, mais si la quantité totale d’éléments sur la stack dépasse cette valeur, vous obtiendrez cette erreur.

Généralement, la récursion infinie en est la cause, mais si vous constatiez cela, votre trace de stack aurait plus de 5 images.

Essayez d’append un argument -Xss (ou augmentez la valeur de un) pour voir si cela disparaît.

Ce qui provoque réellement une erreur java.lang.StackOverflowEr est généralement la récursivité involontaire. Pour moi, c’est souvent quand j’ai eu l’intention d’appeler une méthode super pour la méthode superposée. Comme dans ce cas:

 public class Vehicle { public void accelerate(float acceleration, float maxVelocity) { // set the acceleration } } public class SpaceShip extends Vehicle { @Override public void accelerate(float acceleration, float maxVelocity) { // update the stream capacitor and call super.accelerate // oops meant to call super.accelerate(acceleration, maxVelocity); // but accidentally wrote this instead. A StackOverflow is in our future. this.accelerate(acceleration, maxVelocity); } } 

Tout d’abord, il est utile de savoir ce qui se passe en coulisse lorsque nous appelons une fonction. Les arguments et l’adresse de l’endroit où la méthode a été appelée sont poussés sur la stack (voir http://en.wikipedia.org/wiki/Stack_(abstract_data_type)#Runtime_memory_management ) afin que la méthode appelée puisse accéder aux arguments et que lorsque la méthode appelée est terminée, l’exécution peut continuer après l’appel. Mais comme nous appelons this.accelerate (accélération, maxVelocity) de manière récursive (la récursivité est assez vague lorsqu’une méthode s’appelle elle-même. Pour plus d’informations, voir http://en.wikipedia.org/wiki/Recursion_(computer_science) ) nous sums dans une situation connue sous le nom de récursion infinie et nous continuons à emstackr les arguments et à retourner l’adresse sur la stack d’appels. Comme la stack des appels est de taille limitée, nous finissons par manquer d’espace. Le manque d’espace sur la stack d’appels est appelé débordement. C’est parce que nous essayons d’utiliser plus d’espace de stack que nous et les données débordent littéralement la stack. Dans le langage de programmation Java, il en résulte une exception d’exécution, java.lang.StackOverflow, qui interrompt immédiatement le programme.

L’exemple ci-dessus est quelque peu simplifié (même si cela m’arrive plus que je ne voudrais l’admettre). La même chose peut se produire de manière plus ronde, ce qui rend un peu plus difficile le suivi. Cependant, en général, le StackOverflow est généralement facile à résoudre, une fois qu’il se produit.

En théorie, il est également possible d’avoir un débordement de stack sans récursivité, mais en pratique, cela semble être un événement assez rare.

Lorsqu’un appel de fonction est appelé par une application Java, un cadre de stack est alloué sur la stack d’appels. Le cadre de la stack contient les parameters de la méthode invoquée, ses parameters locaux et l’adresse de retour de la méthode.

L’adresse de retour indique le point d’exécution à partir duquel l’exécution du programme doit continuer après le retour de la méthode invoquée. S’il n’y a pas d’espace pour un nouveau cadre de stack, le StackOverflowError est lancé par la machine virtuelle Java (JVM) .

Le cas le plus courant pouvant éventuellement épuiser la stack d’une application Java est la récursivité.

Jetez un coup d’oeil s’il vous plait

Comment résoudre StackOverflowError

Qu’est-ce que java.lang.StackOverflowError

L’erreur java.lang.StackOverflowError est renvoyée pour indiquer que la stack de l’application était épuisée, en raison d’une récursivité profonde, c’est-à-dire que votre programme / script est récursif trop profondément.

Détails

StackOverflowError étend la classe VirtualMachineError qui indique que la JVM a été ou est à court de ressources et ne peut plus fonctionner. VirtualMachineError qui étend la classe Error est utilisé pour indiquer les problèmes graves qu’une application ne doit pas intercepter. Une méthode ne peut pas déclarer de telles erreurs dans sa clause throw parce que ces erreurs sont des conditions anormales qui ne devaient jamais se produire.

Un exemple

Minimal, Complete, and Verifiable Example :

 package demo; public class StackOverflowErrorExample { public static void main(Ssortingng[] args) { StackOverflowErrorExample.recursivePrint(1); } public static void recursivePrint(int num) { System.out.println("Number: " + num); if(num == 0) return; else recursivePrint(++num); } } 

Sortie de console

 Number: 1 Number: 2 . . . Number: 8645 Number: 8646 Number: 8647Exception in thread "main" java.lang.StackOverflowError at java.io.FileOutputStream.write(Unknown Source) at java.io.BufferedOutputStream.flushBuffer(Unknown Source) at java.io.BufferedOutputStream.flush(Unknown Source) at java.io.PrintStream.write(Unknown Source) at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source) at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source) at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source) at java.io.OutputStreamWriter.flushBuffer(Unknown Source) at java.io.PrintStream.newLine(Unknown Source) at java.io.PrintStream.println(Unknown Source) at demo.StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:11) at demo.StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:16) . . . at demo.StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:16) 

Explication

Lorsqu’un appel de fonction est appelé par une application Java, un cadre de stack est alloué sur la stack d’appels . Le stack frame contient les parameters de la méthode invoquée, ses parameters locaux et l’adresse de retour de la méthode. L’adresse de retour indique le point d’exécution à partir duquel l’exécution du programme doit continuer après le retour de la méthode invoquée. S’il n’y a pas d’espace pour un nouveau cadre de stack, le StackOverflowError est lancé par la machine virtuelle Java (JVM).

Le cas le plus courant pouvant éventuellement épuiser la stack d’une application Java est la récursivité. En récursivité, une méthode s’invoque lors de son exécution. Recursion une des techniques de programmation polyvalentes les plus puissantes, mais doit être utilisée avec précaution pour éviter que StackOverflowError soit évité.

Les références

  • Java Doc
  • StackOverflowError

J’ai créé un programme avec hibernate, dans lequel j’ai créé deux classes POJO, toutes deux ayant un object en tant que membres de données. Lorsque dans la méthode principale j’ai essayé de les enregistrer dans la firebase database, j’ai aussi eu cette erreur.

Cela se produit parce que les deux classes se réfèrent l’une l’autre, créant ainsi une boucle qui provoque cette erreur.

Vérifiez donc si de telles relations existent dans votre programme.

Des exceptions de dépassement de stack peuvent se produire lorsqu’une stack de threads continue à croître jusqu’à atteindre la limite maximale.

Ajuster les options de tailles de stacks (Xss et Xmso) …

Je vous suggère de voir ce lien: http://www-01.ibm.com/support/docview.wss?uid=swg21162896 Il existe de nombreuses causes possibles à une erreur StackOverflowEr, comme vous pouvez le voir dans le lien ….

Dans mon cas, j’ai deux activités. Dans la seconde activité, j’ai oublié de mettre en avant la méthode onCreate.

 super.onCreate(savedInstanceState);