[java]Exception in thread "main" java.lang.StackOverflowError

Résolu
Bonjour,
en executant mon prg j'ai une erreur message suivantes.veuillez m'aidez svp

Exception in thread "main" java.lang.StackOverflowError
at Test3.caracterDansChaine(Test3.java:12)


public class Test3
{
public static void main(String[] args)
{
String nom="KENNEDY";
char t='N';
System.out.println(caracterDansChaine(nom , t));
}
public static boolean caracterDansChaine(String nom,char t)
{
if(caracterDansChaine(nom,t))
{
System.out.println("Le caractère"+t+"se trouve bien dans"+nom);
}
else
{
System.out.println("Le caractère"+t+" ne se trouve bien dans"+nom);
}
return false;
}
}


6 réponses

  1. Modérateur
    Bonjour,

    Le problème c'est que
    caracterDansChaine(String nom,char t)
    , fait un
    if (caracterDansChaine(nom,t))
    qui appelle donc la même méthode avec les même arguments, elle va donc encore faire un
    if (caracterDansChaine(nom,t))
    puis encore un autre, et un autre, à l'infini, jusqu'à planter le programme...
    0
    1. Bonjour,
      je ne comprend pas assez,pouvez vous me donnez plus explication, svp.
      0
      1. Modérateur
        Modifies ton code comme ceci, pour afficher quand tu rentres dans ta méthodes.
        Tu verras mieux ce qui se passe :

        public static boolean caracterDansChaine(String nom,char t)
        {
            System.out.println("caracterDansChaine(nom="+nom+", t="+t+");");
        
            if(caracterDansChaine(nom,t))
            ...
        0
    2. j'avais rectifié comme vous avez dit,après exécution de prg,j'ai aucune erreur ni output

      public class Test3
      {
      public static void main(String[] args)
      {
      String nom="KENNEDY";
      char t='N';
      //System.out.println(caracterDansChaine(nom, t));
      }
      //public static boolean caracterDansChaine()
      public static boolean caracterDansChaine(String nom, char t)
      {
      //System.out.println("caracterDansChaine(nom="+nom+"",t=+t+);";
      System.out.println("caracterDansChaine(nom="+nom+",t="+t);
      if(caracterDansChaine(nom,t))
      {
      System.out.println("Le caractère"+t+"se trouve bien dans"+nom);
      }
      else
      {
      System.out.println("Le caractère"+t+" ne se trouve bien dans"+nom);
      }
      return false;
      }
      }
      0
      1. Modérateur
        Tu n'as plus d'affichage parce que ton programme ne fait plus rien, dans ton main tu as commenté la ligne qui fait l'appel à la méthode. En gros ton programme actuel fait :

        public class Test3 
        {
            public static void main(String[] args) 
            {
                String nom="KENNEDY";
                char t='N';
            }
        }

        Normal qu'il n'y ait rien d'affiché...
        0

    3. public static void main(String[] args)
      {
      String nom="KENNEDY";
      char t='N';
      System.out.println(caracterDansChaine(nom, t));
      }
      quand j'enlève "//" devant System.out.println

      j'ai un output:
      caracterDansChaine(nom=KENNEDY,t=N
      caracterDansChaine(nom=KENNEDY,t=N
      caracterDansChaine(nom=KENNEDY,t=N......
      ......

      je veux un output si
      Le caractère N se trouve bien dans KENNEDY
      0
      1. Modérateur
        Ça j'ai bien compris, mais pour l'instant ton code tourne en rond. D'où ton affichage, et ton exception. Essayes déjà de comprendre pourquoi, mon explication n'a pas l'air de t'avoir aidé, pourtant l'erreur est flagrante !

        Donc comprends pourquoi ton code ne marche pas, et modifies ce qui ne vas pas pour que ça marche...
        0
    4. voilà j'ai résolu mon prg

      public class Test1
      {
      public static void main(String[] args)
      {
      char t='S';
      String nom="KENNEDY";
      if(caracterDansChaine(nom,t))
      {
      System.out.println("Le caracter "+t+"se trouve bien dans "+nom);
      }
      else
      {
      System.out.println("Le caracter "+t+" ne se trouve pas dans "+nom);
      }
      }
      public static boolean caracterDansChaine(String chaine,char c)
      {
      boolean verite=false;
      for(int i=0;i<chaine.length();i++)
      {
      if(chaine.charAt(i)==c)
      {
      verite=true;
      break;
      }
      }
      return verite;
      }

      }

      0