Ajout d'objets dans un tableau

Résolu
Ouss91 Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   -  
Ouss91 Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   -
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 :/
A voir également:

2 réponses

KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16760 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention   > KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention  
 
Je te remercie, je vais tester!
0
Ouss91 Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention  
 
J'ai fixer la taille du tableau à 10, jai la même erreur...
0
KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > Ouss91 Messages postés 35 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention  
 
Bonsoit KX, désolé pour la réponse tardive.
Je te remercie, je vais tester tout ça.
0