Java: Une exception parmi tant d'autres

Fermé
Utilisateur anonyme - 27 déc. 2011 à 10:29
 Utilisateur anonyme - 27 déc. 2011 à 20:21
Bonjour,

Je me suis mis il y a peu a la programmation en java

comme tout bon petit internaute, je me suis rendu sur le Site du zéro pour bien commencer

malheureusement, je suis bloqué, et un certain code refuse de fonctionner

Voici donc ma classe ville, dans laquelle il y a 3 paramètres simples, et un classement qui est attribué a chaque objet.

Malheureusement, je me prends une exception dans la tronche au niveau de la compilation !

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at Ville.setClass(Ville.java:62)
at Ville.<init>(Ville.java:14)
at Main.main(Main.java:4)

(Ville.java:62 correspond a this.classement=classe[i]; dans ma methode setClasse() )
(Ville.java:14 correspond a this.setClass dans le constructeur Ville() )
(Main.java:4 correspond a l'initialisation de l'objet v1)

Où ai'je fauté ?


class Ville {

private char classement='O';
private String nomVille;
private String nomPays;
private int nbreHab;

public Ville(){
System.out.println("Création d'une ville !");
nomVille = "Inconnu";
nomPays = "Inconnu";
nbreHab = 0;
this.setClass();
}

public Ville(String pNom, int pHab, String pays){
System.out.println("Création d'une nouvelle ville avec des paramètres !");
nomVille=pNom;
nbreHab=pHab;
nomPays=pays;
this.setClass();
}


public String getNomVille() {
return nomVille;
}

public void setNomVille(String nomVille) {
this.nomVille = nomVille;
}

public String getNomPays() {
return nomPays;
}

public void setNomPays(String nomPays) {
this.nomPays = nomPays;
}

public int getNbreHab() {
return nbreHab;
}

public void setNbreHab(int nbreHab) {
this.nbreHab = nbreHab;
}

public char getClasse() {
return classement;
}

private void setClass(){
int tabClass[] = {10000000, 1000000, 100000, 10000, 1000, 100, 0,};
char classe[] = {'S','A','B','C','D','E','F'};
int i =0;

while (i<tabClass.length && this.nbreHab<=tabClass[i])
i++;

this.classement=classe[i];
}

public String getInfo(){
return "La ville "+this.getNomVille()+" située en "+this.getNomPays()
+" compte "+this.getNbreHab()+" habitants.\n Elle est donc de classe: "+this.getClasse()+".";
}

}


Merci a vou pour votre compréhension !

A voir également:

3 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 27/12/2011 à 11:26
ArrayIndexOutOfBoundsException n'est pas une erreur de compilation, mais d'exécution !
Cela signifie que tu essayes d'accéder à une case de tableau qui n'existe pas.
Ici tu fais this.classement=classe[i]; avec i=7, alors que classe.length==7, or les indices d'un tableau commencent à 0, et finissent donc à length-1 (ici de 0 à 6), donc à 7 ça plante

Tu devrais modifier la condition de ta boucle while pour prendre en compte la taille du tableau classe.

int max = Math.min(tabClass.length, classe.length-1);

int i=0;
while (i<max && this.nbreHab<=tabClass[i])
    i++;

this.classement=classe[i];
La confiance n'exclut pas le contrôle
1
Mihawk Messages postés 4315 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 846
27 déc. 2011 à 11:14
Et voilà un développeur qui, comme tous, s'est mangé cette exception un bon nombre de fois !
0
Utilisateur anonyme
27 déc. 2011 à 12:28
Merci bien, c'était bel et bien une erreur de calcul de ma part :P

Merci bien !
0
Utilisateur anonyme
27 déc. 2011 à 20:21
Salut,

(Ville.java:62 correspond a this.classement=classe[i]; dans ma methode setClasse() )
(Ville.java:14 correspond a this.setClass dans le constructeur Ville() )
(Main.java:4 correspond a l'initialisation de l'objet v1)

Ces 3 lignes sont à lire de la dernière à la premiere (de la 4 à la 62) et montrent le déroulement du programme la 62 étant celle qui provoque l'exception car i est à 7 et pointe donc sur le 8ème élément d'un tableau qui n'en comporte que 7 numérotes de 0 à 6.

Cordialement,

Dan
0