Ajout d'objets dans un tableau

Résolu/Fermé
Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021 - Modifié le 26 janv. 2021 à 20:02
Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021 - 30 janv. 2021 à 16:31
Hello,

j'essaie d'ajouter des objets dans un tableau, mais j'ai l'erreur suivante : Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

Le bout de code qui coince :


//Définition de la méthode ajouterForme() qui ajoute une nouvelle forme
public void ajouterForme(Forme b){

batiments[batiments.length]=b;
if(batiments.length>10){
System.out.println("Le nombre de formes sur le terrain est limité à 10 !");
}
}


Le code en entier :


public class Terrain extends Forme {

private static Forme[] batiments;

public Terrain(Forme...bat)
{batiments=bat;}

public static void main(String argums[])

{

//Instanciation des classe Rectangle, Triangle, Cercle et du tableau batiments
Rectangle r = new Rectangle(3,3);
Triangle t = new Triangle(2,2);
Cercle c = new Cercle(2);
batiments[0] = r;
batiments[1] = t;
batiments[2] = c;
}

//Définition de la méthode ajouterForme() qui ajoute une nouvelle forme
public void ajouterForme(Forme b){

batiments[batiments.length]=b;
if(batiments.length>10){
System.out.println("Le nombre de formes sur le terrain est limité à 10 !");
}
}

//Définition de la méthode calculerSurfaceTotale() qui calcule la surface totale occupée
public double calculerSurfaceTotale()
{
double surfaceTotale=0;
for ( int i=0 ; i < batiments.length ; i++){
surfaceTotale=surfaceTotale+batiments[i].calculerSurface();
}
return surfaceTotale;
}

//Définition de la méthode affichageSurfaceTotale() qui affiche la surface totale occupée
public void afficherSurfaceTotale()
{System.out.println("La surface totale est de "+calculerSurfaceTotale());}

//Définition de la méthode affichage de la taille du tableau (méthode utilisée pour test)
public void afficherTaille()
{System.out.println(("La taille du tableau est ")+batiments.length);}



}



Help please :/

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 janv. 2021 à 20:39
Bonjour,

Un tableau ne peut pas changer de taille.
Si tu fais un
new Forme[3]
alors
batiments.length
vaudra toujours 3.

batiments[batiments.length]=b
(comme tu l'as fait) sera toujours faux, car les indices d'un tableau vont de 0 à length-1.
Donc
batiments[0]
,
batiments[1]
,
batiments[2]
: oui ça existe, mais
batiments[3]
ça donne l'erreur que tu as.

Pour gérer des tableaux de manière dynamique, il faut :
  • Faire un tableau d'une taille plus importante au départ et stocker dans une variable à côté le nombre de données que tu as mis dedans
  • Quand le tableau est complet, il faut copier toutes les données dans un nouveau tableau plus grand
0
Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021
26 janv. 2021 à 21:41
Merci encore une fois KX,
private static Forme[10] batiments;
Puis-je faire comme ca pour fixer une taille ?
P.S : je ne peux pas instancier la classe Forme.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 janv. 2021 à 21:52
La bonne syntaxe c'est :
private static Forme[] batiments = new Forme[10];

La taille est déjà fixée dans ce code, ce sera 10.

NB. Ce n'est pas une instance de
Forme
, c'est une instance de
Forme[]
ce qui n'a rien à voir.
0
Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
26 janv. 2021 à 22:01
Je te remercie, je vais tester!
0
Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
26 janv. 2021 à 22:01
J'ai fixer la taille du tableau à 10, jai la même erreur...
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021
27 janv. 2021 à 08:17
La même erreur mais sur quel code ? Toujours le même ? Parce que
batiments[batiments.length]
sera toujours faux, que ce soit avec 3, 10, ou 999999999...
Les indices de tableau vont de 0 à length-1, donc dans ton cas de batiments[0] à batiments[9] c'est bon, mais batiments[10] plantera.

Il faut que tu mettes en place ce dont j'ai parlé dans ma première réponse avec un suivi du nombre de données présentes dans le tableau et un redimensionnement quand le nombre de données dépassent la taille du tableau.

private static Forme[] batiments = new Forme[10];
private static int nbBatiments = 0;

public void ajouterForme(Forme b){
    if (nbBatiments == batiments.length) {
         // remplacer batiments par un tableau plus grand
    }
    batiments[nbBatiments]=b;
    nbBatiments++;
}

public void afficherTaille(){
    System.out.println("La taille du tableau est " + batiments.length);
    System.out.println("Le nombre de valeurs dans le tableau est " + nbBatiments);
}
0
Ouss91 Messages postés 35 Date d'inscription dimanche 24 janvier 2021 Statut Membre Dernière intervention 20 juillet 2021 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
27 janv. 2021 à 18:13
Bonsoit KX, désolé pour la réponse tardive.
Je te remercie, je vais tester tout ça.
0