Plantage a cause de la récursivité ?

fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 - 22 févr. 2010 à 09:57
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 - 22 févr. 2010 à 11:00
Bonjour,
Ne connaissant pas grand chose à java, je fais appel à votre aide.

J'essaie de debugger un programme.
Ce programme liste des composants d'une fenêtre, pour faire simple :
nouveauComposant()
{
rechercheDesFils()
}

rechercheDesFils()
{
   try {
int nbfils = ((Container) nomComposant).getComponentCount();
// ici trace 1
for (int = 0; i < nbfils; i++) {
// ici trace 2
nouveauComposant fils = new nouveauComposant();
}
   } catch(Throwable th) {
      // trace 3
   }

}


nouveauComposant peut-être appelé par plusieurs threads.
Ce code est dans une applet.
Quand celle-ci freeze (plante ?) j'ai la trace 1 mais pas la trace 2 ou 3.
Ca ne plante pas toujours au meme moment. Mais c'est quand très étrange que ce soit la trace1 la dernière trace.

Est-ce lié au nombre de récursivités ?

Merci

4 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
22 févr. 2010 à 10:10
Salut,

Donne le vrai code parce que là, je vois pas trop quoi te dire. Sinon pour la récursivité, t'inquiètes pas y'a un peu de place dans la pile d'appels quand même.
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
22 févr. 2010 à 10:24
Poster tout le code serait un peu lourd, il y a plein de tests, j'espère que cette version suffit :
// les appelants (dans 2 threads différents) mais d'apres les traces cette lignes n'est pas appelée simultanemment
NouveauComposant comp = ComponentFactory.nouveauNoeud(window); // window étant la top-level window détectée

public class ComponentFactory {
static public NouveauComposant nouveauNoeud(Component comp)
{
....
return new NouveauComposant(comp);
}
}

class NouveauComposant {
protected Vector children = new Vector();

public NouveauComposant(Component comp) {
if (component instanceof Container) {
addNodes((Container) component);
}
}

private addNodes(Container c)
{
try {
int count = ((Container) c).getComponentCount();
Logger.log("count " + Integer.toString(count));
for (int i = 0; i < count; i++) {
Logger.log(" addNodes child " + c.getComponent(i).getName(), 2);
NouveauComposant child = ComponentFactory.nouveauNoeud(c.getComponent(i));
children.add(child);
}
}
catch(Throwable th)
{
Logger.log("addNodes catched : " + th.getMessage());
}
}
}
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
22 févr. 2010 à 10:52
Navré, je ne vois pas ce qui cloche. Tu as essayé de lancer ton applet en pas à pas (mode debug)?
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
22 févr. 2010 à 11:00
Non je n'ai pas essayé le mod debug. Mon applet est en fait une "Form Oracle", je vais voir comment on debug cette étrangeté avec leur génial runtime (nommé jinitiator) basé sur la JRE 1.3.

Sinon, le fait que la fonction récursive soit appelée par 2 threads, ne pourrait pas poser de pb ? Meme si, d'apres mes traces, quand ca plante, je n'ai pas accès concurrent.
0