Ajout d'objets dans un tableau [Résolu]

Signaler
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021
-
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021
-
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

Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
2 826
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
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021

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.
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
2 826 >
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021

Oui, mais c'est dommage de se limiter à 10 alors que le système de redimensionnement automatique est quand même très simple à mettre en place...
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021
>
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021

Bonjour KX,

Désolé de ma réponse tardive. La limite de taille à 10 est imposée par l'exercice.
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021
>
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021

Du coup voici la dernière version de mon code, ca m'affiche encore une erreur...


public class Terrain extends Forme {

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

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[nbBatiments]=b;
nbBatiments++;
}

//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);
System.out.println("Le nombre de valeurs dans le tableau est " + nbBatiments);}



}
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
2 826 >
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021

J'ai l'impression de revoir encore et toujours le même code, tu ne prends pas en compte les corrections au fur et à mesure que je te fournis du code...

Donc, relis tous les messages précédents, pour comprendre le code suivant, qui fonctionne.

public class Terrain extends Forme {
    private Forme[] batiments;
    private int nbBatiments;

    public Terrain(Forme... formes) {
        batiments = new Forme[10];
        nbBatiments = 0;
        for (int i = 0; i < formes.length; i++) {
            ajouterForme(formes[i]);
        }
    }

    public void ajouterForme(Forme forme) {
        batiments[nbBatiments] = forme;
        nbBatiments++;
    }

    @Override
    double calculerSurface(){
        double surfaceTotale = 0;
        for (int i = 0; i < nbBatiments; i++) {
            surfaceTotale = surfaceTotale + batiments[i].calculerSurface();
        }
        return surfaceTotale;
    }

    public void afficherSurfaceTotale(){
        System.out.println("La surface totale est de " + calculerSurface());
    }

    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);
    }

    public static void main(String argums[]) {
        Rectangle r = new Rectangle(3, 3);
        Triangle t = new Triangle(2, 2);
        Cercle c = new Cercle(2);
        Terrain terrain = new Terrain(r, t, c);
        terrain.afficherTaille();
        terrain.afficherSurfaceTotale();
    }
}
Messages postés
27
Date d'inscription
dimanche 24 janvier 2021
Statut
Membre
Dernière intervention
31 janvier 2021
>
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021

Merci KX, je vais analyser ce code.