Tableau en java

Résolu/Fermé
RYME1983 Messages postés 3 Date d'inscription mercredi 11 novembre 2015 Statut Membre Dernière intervention 11 novembre 2015 - Modifié par KX le 11/11/2015 à 14:55
KX Messages postés 16633 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 novembre 2022 - 11 nov. 2015 à 16:18
Bonjour
Je suis débutante j ai créé une classe Traitement et dedans une méthode qui lit des valeurs de type String et les mettre dans un tableau , voici le code le problème je peux pas accéder au tableau , cependant si je mets la création de tableau dans la méthode ça marche , ???????????vous avez une idée de ce bug
public class Traitement {
   
   int         compt ;  
   int        NbreVal ;
   java.util.Scanner entree =   new java.util.Scanner(System.in);
   String tabV[] =new String[NbreVal];   
  
   
    Traitement (int NbreVal){
    this.NbreVal=NbreVal;    
                            }   
          
   public void LireValeur() {     
   System.out.println("Veuillez entrer les valeurs:");   
   for (compt=0;compt<NbreVal-1;compt++){
            tabV[compt]=(entree.next());
                                       }
   
    entree.close();
        
                            }

1 réponse

KX Messages postés 16633 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 novembre 2022 2 981
Modifié par KX le 11/11/2015 à 15:08
Bonjour,

Lorsque tu créés ton tableau
String tabV[] =new String[NbreVal];
quelle est la valeur de NbreVal ? La réponse c'est 0 puisque c'est la valeur par défaut quand tu fais
int NbreVal;
, donc ton tableau tabV ne contient aucune case...

Si tu veux prendre en compte la taille NbreVal que tu utilises dans ton constructeur, alors il faut initialiser ton tableau à ce moment là, pas avant.

Remarques :
Pas besoin de déclarer nbreVal en attribut privé, sa valeur est porté par le tableau :
tabV.length
.
De même pas besoin de déclarer compt dans la classe, c'est une variable locale à la méthode lireValeur.

Et attention : il ne faut jamais fermer System.in parce que tu ne pourras pas le réouvrir (donc pas de
entree.close();
quand le Scanner porte sur System.in)

import java.util.Scanner;

public class Traitement {

    private static final Scanner entree = new Scanner(System.in);

    private final String[] tabV;   

    public Traitement(int nbreVal) {
        tabV = new String[nbreVal];
    }
      
    public void lireValeur() {     
        System.out.println("Veuillez entrer les "+tabV.length+" valeurs :");   
        for (int compt=0; compt<tabV.length; compt++) {
            tabV[compt] = entree.nextLine();
    }
}
La confiance n'exclut pas le contrôle
0
RYME1983 Messages postés 3 Date d'inscription mercredi 11 novembre 2015 Statut Membre Dernière intervention 11 novembre 2015
11 nov. 2015 à 15:45
Bonjour


C 'est bon le problème est réglé , je vous remercie , a mes connaissance le constructeur va modifier la valeur de NbrVal la je comprends les attributs exécutent avant le constructeur , la création de tableau avec l indice 0 passe avant le constructeur . Merci beaucoup
0
RYME1983 Messages postés 3 Date d'inscription mercredi 11 novembre 2015 Statut Membre Dernière intervention 11 novembre 2015
11 nov. 2015 à 15:47
Autre chose pour la valeur Compt est globale car j en aurais besoin dans d autres méthodes
0
KX Messages postés 16633 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 26 novembre 2022 2 981 > RYME1983 Messages postés 3 Date d'inscription mercredi 11 novembre 2015 Statut Membre Dernière intervention 11 novembre 2015
11 nov. 2015 à 16:18
C'est une mauvaise idée de la mettre globale, si tu t'en sers plusieurs fois, déclares là plusieurs fois, mais toujours le plus localement possible, on ne doit mettre en global que ce qui est transverse, c'est à dire que la valeur doit être stocké et transporté d'une méthode à une autre (comme le tableau), mais pour un compteur ça n'a aucun intérêt.
0