Probléme boucle

Résolu/Fermé
peouts Messages postés 10 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 31 décembre 2022 - Modifié le 30 oct. 2017 à 08:23
 walidyahiacherif @gmail.com - 4 nov. 2017 à 03:30
Bonjour,

bonjour les amis, je suis débutant en JAVA et j'ai pas compris la boucle ci-dessous :
voila le code :
package boucles;

public class PracticeYourKnowledge {

 public static void main(String[] args) {
 
 int tab[]= {10,20,30,40,50,60,70};
 for (int i = 0; i<tab.length; ++i) {
 System.out.println(tab[i]);
 tab[i+3] = 5;
 }
  }
 
 }

et voila le résultat aprés compilation, je veux savoir pourquoi il affiche 5 5 et pas 5 5 5 à la fin pour couvrir tout le tableau avant d'afficher l'erreur :
10
20
30
5
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at boucles.PracticeYourKnowledge.main(PracticeYourKnowledge.java:10)

Merci d'avance

4 réponses

jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 1 nov. 2017 à 00:52
Bonjour

Ca arrivé à la sixième iteration.. tu depasses les bornes de ton tableau.
(Première itération i=0)
Ton tableau a une taille de 7.. hors tu fais i+3
5+3 = 8.. tu es donc en dehors


edit : oui 4+3 = 7 > à l'indice max tu tableau qui est 6 ( de 0 à 6 = 7 valeurs )

Cordialement, 
Jordane                                                                 
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
30 oct. 2017 à 08:33
Bonjour,

"voila le résultat aprés compilation"
Point de vocabulaire : ce que tu montres c'est le résultat de l'exécution.

"pourquoi il affiche 5 5 et pas 5 5 5 à la fin (...) avant d'afficher l'erreur"
La réponse est dans la question : c'est parce qu'il y a eu l'erreur que le programme s'est arrêté après 5 5 et n'a donc pas affiché 5 5 5.

Il faut décortiquer l'erreur pour en obtenir des informations utiles :
  • PracticeYourKnowledge.java:10
    est la ligne de code qui pose problème, c'est à dire
    tab[i+3] = 5;
    dans ce cas.
  • ArrayIndexOutOfBoundsException: 7
    est la description de l'erreur qui indique que tu essayes d'accéder à la case 7 qui n'existe pas puisque le tableau a des cases numérotées de 0 à 6.

Je t'invites à afficher l'intégralité de ton tableau à chaque tour de boucle, ça te permettra de mieux suivre les modifications que tu effectues.
Par exemple avec
System.out.println(java.util.Arrays.toString(tab));
0
Jordane45,
merci pour ta réponse ainsi que KX,
Jordane 45 ce que je veux comprendre c'est pourquoi il a fait (5+3) qu'à parir de la 5eme itération, une fois 30 affiché ,que se passe il aprés chaque itération, désolé mais je suis un débutant extrême .
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
31 oct. 2017 à 07:04
5eme.iteration.. 5+3 ... Tu ne vois pas ?
Un indice... Le chiffre 5.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
31 oct. 2017 à 11:04
"pourquoi il a fait (5+3) qu'à parir de la 5eme itération, une fois 30 affiché"
Il n'a jamais fait 5+3, la 5è itération c'est i=4, donc 4+3=7 d'où le message d'erreur ArrayIndexOutOfBoundsException: 7
Quant au 30 il est affiché à la 3è itération (10, 20, 30) donc il y a eu la 4è itération entre temps (celle qui affichait le premier 5) sans oublier la 5è itération qui plante.

Pour t'aider à compter il faudrait faire ce que je t'ai indiqué dans mon message d'hier et rajouter des affichages.

public static void main(String[] args) {
    int tab[]= {10,20,30,40,50,60,70};

    for (int i = 0; i<tab.length; ++i) {
        System.out.println("tab=" + java.util.Arrays.toString(tab));
        System.out.println("i=" + i);
        System.out.println("tab[i]="+tab[i]);
        tab[i+3] = 5;
        System.out.println("tab=" + java.util.Arrays.toString(tab));
        System.out.println();
    }
}
0
peoutss > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
1 nov. 2017 à 00:21
Merci les amis,
Je pense à zapper ce problème afin d'éviter de vous énerver daventage, peut étre que le temps me portera conseil j'arrive pas à comprendre pkoi il commencé à faire i+3 qu'à partir de 4 et pas à partir de 1.
j’essaie d'étre curieux afin bien comprendre le langage sachant que j'ai créé moi même ce problème en ajoutant le tab[i+3] = 5;

Je vous remercie pour votre temps chers.
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 1 nov. 2017 à 00:51
Ton tableau contient 7 valeurs (10,20... 70)
Il a donc une dimension de 6 ( l'indice 0 étant la première valeur.. le dernier indice sera 6 )

Dans ta boucle.... tu vas de i=0 jusqu'à i=7
tu affiche la valeur correspondant à l'indice
10 puis 20 etc...
Dans un même temps ... tu AFFECTES la valeur 5 à l'indice i+3
Donc :

première itération (i=0)
tu affiches 10
tu stockes 5 dans tab[3]

deuxième itération (i=1)
tu affiches 20
tu stockes 5 dans tab[4]

troisième itération (i=2)
tu affiches 30
tu stockes 5 dans tab[5]

quatrième itération (i=3)
tu affiches la contenu de tab[3] soit 5 (voir première itération)
et tu stockes 5 dans tab[3+3] =>6


cinquième itération i = 4
tu affiches la contenu de tab[4] soit 5 (voir deuxième itération)
et tu stockes 5 dans tab[4+3] =>7
étant plus grand que l'indice max de ton tableau... il crache...

est-ce plus clair ??

Cordialement, 
Jordane                                                                 
0
walidyahiacherif @gmail.com
4 nov. 2017 à 03:30
Merci bcp Jordan,
Y'a pas plus claire que ça, c'est ce genre de réponse que je voulais avoir justement étant un pure débutant (15 jours seulement) .grand merci
0