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.