IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Erreur "StackOverflowError" avec des listes


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Erreur "StackOverflowError" avec des listes
    Bonjour,

    Je désire faire un TAD liste, qui est composé d'un tableau de dates à partir de la classe Date ci-dessous et composé également des champs jours, mois et année, ainsi qu'un entier l, lequel représente la longueur.

    Je suis obligé par mon prof à utiliser la récursivité dans les méthodes static de la classe liste, et à utiliser 2 constructeurs listevide() et Liste().

    Je n'ai pas inclus les exceptions quand la liste est vide pour le moment.

    En exécutant, j'ai toujours une erreur comme suit:
    Exception in thread "main" java.lang.StackOverflowError
    at Liste.<init>(Liste.java:13)
    at Liste.listevide(Liste.java:19)
    at Liste.longueur(Liste.java:38)
    at Liste.adjq(Liste.java:50)
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class Date {
        private int j,m,a,nbr;
        private boolean t;
        public Date(int j, int m, int a)throws ErrConst{
            if ( m>12 || j>nbrjour(m,a) )
            throw new ErrConst();
            else
            this.j=j;
            this.m=m;
            this.a=a;
            }
        public int jour(){return j;}
        public int mois(){return m;}
        public int année(){return a;}
        public int difference (Date b){
     
            int s = (j-b.j)+ (m-b.m)*nbrjour(m,a)+(a-b.a)*365;
     
            return (Math.abs(s));
        }
        public int nbrjour(int m, int a){
            if ((m==1) || (m==3) || (m==5) || (m==7) || (m==8) || (m==10) || (m==12)) {
                nbr=31;}
                else 
                {if( (m==4) || (m==6) ||(m==9)||(m==11))
                    nbr=30;
            else
     
            {if (m==2){if (bissextile(a))
                    nbr=29;
            else 
                nbr = 28;}
            }}
                return(nbr);}
     
        public void avancer(int x){
            j=this.j+x;
            while (j > nbrjour(m,a)){
                j-=nbrjour(m,a);
            if (m<12)
                m++;
            else{ 
                m=1;
            a++;}
     
            }}
     
        public boolean bissextile(int a){
            if (a%4==0){t=true;}
            return (t);}
        public String toString(){
            return ("("+j+"/"+m+"/"+a+")");
            }
        }
    La classe liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class Liste {
        public  int l;
        public  Date [] a;
     
        public static boolean est_vide(Liste t){
            if (t.a[0]==null){return (true); }
            else {return (false);}}
     
        public static Date premier(Liste t){
        return t.a[0];
        }
     
        public  Liste(){
            a= new Date[10];    
            l=0;
            }
     
        public static Liste listevide(){
            Liste h=new Liste();
            h.l=0;
            h.a=new Date[10];    
            return h;
            }
     
        public static Liste cons(Liste t,Date d){//pour ajouter une date a la liste//
     
            if (est_vide(t)){
                t.a[0]=d; 
                t.l++;}
            else{
            t.l++;
        for (int i=t.l-1;i>0;i--)
        { t.a[i]=t.a[i-1];}
        t.a[0]=d;}
        return t;}
     
     public static int longueur(Liste t)
        {if (t==listevide()) return 0;
        else return 1+longueur(reste(t));
        }
        public static  Liste reste(Liste t) {
        t.l--;
        { for(int i=0;i<t.l;i++)
            { t.a[i]=t.a[i+1];}
     
        return t;
     
            }}
     
        public static Liste adjq(Liste t,Date d){
       if (t==listevide())
            return (cons(listevide(),d));
       else 
           return cons(adjq(t,d),d);
            }
     
        public static boolean appartient(Liste t,Date d){
            if (t.a[0]==d)
                return (true);
                else return (appartient(reste(t),d));
        }
        }
    Classe d'exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class Dateexe {
        public static void main(String[] args) {
            try{
                Liste t=new Liste();
                Liste.listevide();
                Date a=new Date(1,8,2013);
                Date b= new Date(2,8,2013);
                Date c=new Date(3,8,2013);
                Date d=new Date(4,8,2013);
     
                Liste.cons(t,a);
                Liste.cons(t,b);
                Liste.cons(t,c);
                Liste.adjq(t,d);
                System.out.println(Liste.longueur(t));
                for (int i=0;i<Liste.longueur(t);i++)
                {System.out.println(t.a[i]);}
                System.out.println("la premiere Date est : "+Liste.premier(t));
                System.out.println("le reste des dates est : ");
                Liste.reste(t);
                  for (int i=0;i<Liste.longueur(t);i++)
                    {System.out.println(t.a[i]);}}
                catch (ErrConst e){System.out.println("Date invalide!");}
                }}
    Quelqu'un saurait-il m'indiquer d'où peut venir le problème ?

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Pour tester si une année est bissextile ou non, utilise la méthode isLeapYear de GregorianCalendar. Et la méthode add pour faire des ajouts ou retrait. Ta classe Date est inutile.

    Sinon pour l'exception, il est fort probable que tu as une boucle infinie avec la fonction récursive adjq dans la classe Liste.

    A+.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/04/2009, 19h33
  2. Problème avec des listes et des variables
    Par Knuckles dans le forum Général Python
    Réponses: 3
    Dernier message: 09/05/2006, 18h24
  3. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo