J'ai une erreur java.lang.ArrayIndexOutOfBoundsException

Résolu/Fermé
KENZA15A Messages postés 2 Date d'inscription jeudi 5 décembre 2013 Statut Membre Dernière intervention 1 janvier 2014 - Modifié par pijaku le 20/12/2013 à 08:47
 KENZA15A - 20 déc. 2013 à 02:27
bjr tt le mnd
j'ai une erreur java.lang.ArrayIndexOutOfBoundsException dans mon pgm et je ne sais pas pourquoi ,veuillez m'aider.
voici le pgm


 public  void tabs()
 {
   for(int i=0;i<nbrclients;i++){
    Scanner clavier2=new Scanner(System.in);
    System.out.println("entrer le numero de client svp");//pour fixer le pointeur du tableau
    //System.out.println("entrer le numero du client numero : "+(i+1)+" svp");
    double x=clavier2.nextDouble();
    i=(int) x-1;//client 1= tab[0]
    Scanner clavier3=new Scanner(System.in);
    System.out.println("entrer l'abcice du client numero : "+(i+1)+" svp");//pr entrer le x du i eme client
    tabx [i]=clavier3.nextDouble();
    Scanner clavier33=new Scanner(System.in);
    System.out.println("entrer l'ordonnée du client numero : "+(i+1)+" svp");//pr entrer le y du i eme client
    taby[i]=clavier33.nextDouble();
                                Scanner dem=new Scanner(System.in);//entrer la demande
    System.out.println("entrer la demande du client numero : "+(i+1)+" svp");//pr entrer le y du i eme client
    demande[i]=dem.nextDouble();}
   
   //afficher les x
   System.out.println("tab des x : ");
   for (int i=0;i<nbrclients;i++){
    
    System.out.print (" "+tabx[i]+" ");
   }
   System.out.println("\n");
   System.out.println("tab des y : ");
   //afficher les y
   for (int i=0;i<nbrclients;i++){
    
            System.out.print (""+taby[i]+" ");
   }
                 System.out.println("\n");
   System.out.println("tab des demandes : ");
   //afficher les y
   for (int i=0;i<nbrclients;i++){
    
    System.out.print (" "+demande[i]+" ");
   }
  
   }
       
 
 public static void main(String[] args) { 
              Main r=new Main();
             //verification
             String ver="y";
        while(ver.equals("y"))
      {
         Scanner clavier=new Scanner(System.in);
 System.out.println("entrer le nombre de clients svp");
 nbrclients= clavier.nextInt();
 //System.out.println("le nembre de clients est : "+" "+nbrClients); essai
  tabx=new double [nbrclients] ;//reinitialiser la longeur du vect selon le input
 taby=new double [nbrclients] ;

  r.tabs();
  
                Scanner cl=new Scanner(System.in);
 System.out.println("voulez vous faire un nouveau calcul?? si oui appuyez sur y sinon sur un autre bouton");
        ver= cl.next();//variable de la verification de l'iteration
 }
         System.out.println("vous avez choisi de quitter ,merci");
        }
       

}

2 réponses

tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
7 déc. 2013 à 09:09
ArrayOutOfounds : Suppose que tu essaie d'accéder à une position qui n'existe pas dans un tableau. Tu dois avoir la ligne dans laquelle tu accède à cette position du tableau dans la trace de l'exception.

Conseil: Utilise des variables qui donnent du sens à ce que tu fais, on se perd très vite lorsqu'on commence à lire ton code.

Donc probablement dans l'une de tes boucles, lors d'un accès à un élément d'un tableau, tu n'indique pas la bonne position.

Autre chose: Revois aussi ta manière de créer et initialiser les variables tabx et taby on s'y perd un peu
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 déc. 2013 à 11:57
Dans la catégorie des trucs à éviter :

N'utilise pas de variables globales static lorsqu'elles un comportement de variables locales.
Et n'utilise pas non plus de constructeur d'un objet juste pour appeler pour une méthode qui devrait être static.
Dans ton code soit tout est static, soit rien ne l'est, mais le mélange des genres est horrible.

De plus ne créé pas de Scanner à chaque fois que tu veux faire une lecture. Tu as un seul clavier sur ton ordinateur, il n'y a donc qu'un seul flux System.in, donc il n'y a aucune raison d'utiliser plus d'un objet Scanner pour lire le flux du clavier.
Et avec le Scanner adapte les types de données que tu veux, pourquoi avoir pris un double x, alors que son seul intérêt est de faire int i = (int) x -1; Autant prendre directement un int x.


Sinon pour en revenir à ton ArrayOutOfBoundsException je pense qu'il faudrait regarder la manière don tu as initialisé le tableau "demande", cela n'apparaît pas dans ton code, je pense qu'il est dimensionné une seule fois, mais peut être pas suffisamment grand, il devrait normalement être de la même taille que les autres tableaux :

demande = new double[nbrclients];
0
MERCI BCP pour votre indications
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 7/12/2013 à 11:59
Voici un code complet, indenté, avec de la coloration syntaxique, pour qu'on y voie plus clair.
Je ne suis pas sûr qu'il corresponde exactement à ce que tu as fait, j'ai complété les trous comme j'ai pu.
Penses y la prochaine fois que tu postes un code, on n'aime pas jouer aux devinettes, et encore moins lire un code mal mis en forme comme tu l'as fait...

package test;

import java.util.Scanner;

public class Main
{
    static int nbrclients;
    static double[] tabx;
    static double[] taby;
    static double[] demande = new double[5];
    
    public void tabs()
    {
        for (int i = 0; i < nbrclients; i++ )
        {
            Scanner clavier2 = new Scanner(System.in);
            System.out.println("entrer le numero de client svp");// pour fixer le pointeur du tableau
            // System.out.println("entrer le numero du client numero : "+(i+1)+" svp");
            double x = clavier2.nextDouble();
            i = (int) x - 1;// client 1= tab[0]
            
            Scanner clavier3 = new Scanner(System.in);
            System.out.println("entrer l'abcice du client numero : " + (i + 1) + " svp");// pr entrer le x du i eme client
            tabx[i] = clavier3.nextDouble();
            
            Scanner clavier33 = new Scanner(System.in);
            System.out.println("entrer l'ordonnée du client numero : " + (i + 1) + " svp");// pr entrer le y du i eme client
            taby[i] = clavier33.nextDouble();
            
            Scanner dem = new Scanner(System.in);// entrer la demande
            System.out.println("entrer la demande du client numero : " + (i + 1) + " svp");// pr entrer le y du i eme client
            demande[i] = dem.nextDouble();
        }
        
        // afficher les x
        System.out.println("tab des x : ");
        for (int i = 0; i < nbrclients; i++ )
        {
            System.out.print(" " + tabx[i] + " ");
        }
        
        System.out.println("\n");
        System.out.println("tab des y : ");
        
        // afficher les y
        for (int i = 0; i < nbrclients; i++ )
        {
            System.out.print("" + taby[i] + " ");
        }
        
        System.out.println("\n");
        System.out.println("tab des demandes : ");
        
        // afficher les y
        for (int i = 0; i < nbrclients; i++ )
        {
            System.out.print(" " + demande[i] + " ");
        }
    }
    
    public static void main(String[] args)
    {
        Main r = new Main();
        
        // verification
        String ver = "y";
        while (ver.equals("y"))
        {
            Scanner clavier = new Scanner(System.in);
            System.out.println("entrer le nombre de clients svp");
            nbrclients = clavier.nextInt();
            
            // System.out.println("le nembre de clients est : "+" "+nbrClients); essai
            tabx = new double[nbrclients];// reinitialiser la longeur du vect selon le input
            taby = new double[nbrclients];
            
            r.tabs();
            
            Scanner cl = new Scanner(System.in);
            System.out.println("voulez vous faire un nouveau calcul?? si oui appuyez sur y sinon sur un autre bouton");
            ver = cl.next();// variable de la verification de l'iteration
        }
        
        System.out.println("vous avez choisi de quitter ,merci");
    }
}
0