Problèm avec les tableau en java

Fermé
nah01 Messages postés 75 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 2 novembre 2012 - 31 mars 2009 à 09:30
nah01 Messages postés 75 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 2 novembre 2012 - 31 mars 2009 à 10:55
Bonjour,
je voudrais créer une classe java nommée : Date. Qui contient les méthodes suivantes (lecture de la date, affichage de la date, suivant( qui prend en paramètre une date et affiche la date suivante), la date précédente.
Pour l’instant mon programme réalise les 2 premières méthodes (lecture et affiche) et pour la méthode : suivant, j’ai déclaré deux tableaux : le premier initialisé avec les 7 jours de la semaine, le second avec les 12 mois. C’est vrai j’ai pas encore traiter tous les cas mais pour l’instant j’aimerai juste que si j’entre « lundi …» comme jour il m’affiche « mardi… »

Le programme compile bien mais en exécutant, au niveau de la méthode :suivant il m’envoi l’erreur : Erreurjava.lang.arrayIndexOutOfBoundsException: 7

Voilà mon code :

import java.io.*;
import java.lang.*;
public class Date
{ String jour;
int num;
String mois;
int annee;

static Date lecture(String j, int n, String m, int A)
{ Date D=new Date();
D.jour=j;
D.num=n;
D.mois=m;
D.annee=A;
return D;
}// fin de la lecture

static Date affiche(Date D)
{System.out.print(D.jour+","+D.num+" "+D.mois+" "+D.annee);
return D;
}//fin affiche

static Date suivant(Date D)
{String J[]={"lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"};
String M[]={"janvier","fevrier","mars","avril","mai","juin","juillet","aout","septembre","octobre","novembre","decembre"};

for(int i=1;i<=7;i++)
{ if(D.jour==J[i])
{D.jour=J[i+1];
}
}//for i..
for(int j=1;j<=12;j++)
{if (D.mois!=M[j])
{j+=j;

}//if
else
{D.mois=M[j+1];
}

}//for j..
return D;

}

public static void main(String[] args)
{String x,y,z,t;
int a,b;
try
{
BufferedReader clavier=new BufferedReader(new InputStreamReader(System.in));

System.out.println("Entrer une date svp");
System.out.print("le jour :");
x= clavier.readLine();
System.out.print("le :");
y= clavier.readLine();
a =Integer.parseInt(y);
System.out.print("le mois :");
z= clavier.readLine();
System.out.print(" l'annee :");
t= clavier.readLine();
b= Integer.parseInt(t);

Date D=new Date();
D= lecture(x,a,z,b);
affiche(D);

Date F=new Date();
F=suivant(D);
System.out.print("la date suivante est :");
affiche(F);

}//try
catch(Exception e)
{System.err.println("Erreur"+e);
}//fin catch
}//fin main
}
A voir également:

3 réponses

NookZ Messages postés 2138 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 7 mars 2013 514
31 mars 2009 à 10:07
C'est simplement car vous dépassez la taille de votre tableau. En effet, en Java la première case du tableau est celle d'indice 0. Donc quand dans votre première boucle i=7 ça ne peut pas fonctionner surtout que vous utilisez un J+1. Il y a une autre modification à faire pour que lorsque vous arrivez sur dimanche, il ressorte lundi

for(int i=0;i<7;i++){
if(D.jour==J[i])
if (i==6)
D.jour=J[0];
else
D.jour=J[i+1];
}//for i..

Voici pour les jours. Vous pouvez enlever les accolades lorsque la condition contient uniquement un élément que ce soit une instruction ou une autre condition mais pensez à marquer l'indentation (ce que je ne peux pas faire ici)

pour les mois je ne comprend pas trop votre logique, normalement on passe au mois suivant uniquement si on atteint le dernier jour du mois alors expliquez-moi
0
nah01 Messages postés 75 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 2 novembre 2012 4
31 mars 2009 à 10:17
merci à toi nookz pour les tableaux
en ce qui concerne les mois je n'avais pas encore achevé le traitement je vais le faire tout à l'heure et je te ferais signe.
au fait je ne comprend pas bien quand vous dites que je peux enlever les accolades svp expliquez bien
merci d'avances
0
NookZ Messages postés 2138 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 7 mars 2013 514
31 mars 2009 à 10:36
Et bien les accolades servent à définir le groupe d'instructions qui sont concernées par l'élément avant les accolades (élément qui peut être une condition, une classe, une méthode, une fonction, une boucle etc...)
Donc quand il y a une seule ligne de code que vous mettiez :
if (condition) {
int i=0;
}
int j=2;

comme seul int i=0; est affecté par la condition, c'est comme si vous écriviez
if (condition)
int i=0;
int j=2;

car alors la condition ne prendra en compte que la ligne directement en dessous.
Cependant une condition telle que
if(condition2)

else


est considérée comme une seule instruction dans son ensemble ainsi on peut écrire
if (condition1)
if (condition2)
int i=1;
else
int j=1;

mais on écrit

if (condition1) {
//ici commence linstruction de la condition2
if (condition2)
int i=1;
else
int j=1;
//ici finit l'instruction de la condition2
//ici commence l'instruction d'affectation
int k=3;
//ici finit l'instruction d'affectation
}
0
nah01 Messages postés 75 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 2 novembre 2012 4
31 mars 2009 à 10:55
merci beaucoup!!!!
je te fais signe
0