Java: Une exception parmi tant d'autres

Utilisateur anonyme -  
 Utilisateur anonyme -
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 19031 Statut Modérateur 3 020
 
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 4753 Statut Contributeur 846
 
Et voilà un développeur qui, comme tous, s'est mangé cette exception un bon nombre de fois !
0
Utilisateur anonyme
 
Merci bien, c'était bel et bien une erreur de calcul de ma part :P

Merci bien !
0
Utilisateur anonyme
 
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