J'ai une erreur java.lang.ArrayIndexOutOfBoundsException

Résolu
KENZA15A Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
 KENZA15A -
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   Statut Membre Dernière intervention   25
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
KENZA15A
 
MERCI BCP pour votre indications
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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