IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

NullPointerException sur un tableau de String


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut NullPointerException sur un tableau de String
    Bonjour,
    lors de la déclaration de mon tableau de String, je me retrouve avec un NullPointerException. J'ai beau chercher, je ne trouve vraiment pas.

    J'ai bien vérifié que les éléments que je passais en paramètre n'étaient pas nuls à l'aide de System.out.println(), et ce n'est pas le cas.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String [] elements = prop.getProperty(nomFichierSansExtension[0]).split(";");
    ]

    ici, nomFichierSansExtension est un tableau de String.
    Je veux récupérer les valeurs contenues dans mon fichier properties et les mettre dans un tableau de String (elements) en utilisant la méthode split(), car les valeurs sont séparées par des ;

    Merci de votre aide.

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    A vue de nez si tu dis que nomFichierSansExtension[0] n'est pas null, c'est prop qui vaut null.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Par défaut
    Ou bien nomFichierSansExtension[0] n'est pas une propriété de prop et la c'est le split qui lance l'exception.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Pourtant, lorsque je fais :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(nomFichierSansExtension[0]);
    Je retrouve bien la valeur que j'attends (le nom du fichier sans l'extension)

    et lorsque je fais
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(prop.getProperty(nomFichierSansExtension[0]));
    J'obtiens bien la ligne corespondante dans mon fichier.properties.

    Je vous poste le code complet (je l'ai réduit dans un petit main à l'arrache, pour le sortir du projet) .

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    static Properties prop = new Properties();
    private static void chargerProp(String nomFichier) {
    	try {
    		FileInputStream in = new FileInputStream(nomFichier);
    		prop.load(in);
    		in.close();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }
     
     public static void main (String [ ] args)
      {
            String[] nomFichierSansExtension;
    	String valeur;
    	ArrayList<Fichier> al = new ArrayList<Fichier>();
    	  String[] tab = {"fichier.cfg","fichier2.cfg","fichier1.properties","fichier2.properties" };
    	  Hashtable<String, String> ht = new Hashtable<String, String>();
    		for (int i = 0; i < tab.length; i++) {
     
    			// on obtient fichier par exemple
    			nomFichierSansExtension = tab[i].split("\\.");
    			// lecture des éléments à chercher dans un fichier
    			chargerProp("donnees.properties");
     
     
    			System.out.println(nomFichierSansExtension[0]);
     
    	System.out.println(prop.getProperty(nomFichierSansExtension[0]));
     
    	String [] elements = prop.getProperty(nomFichierSansExtension[0]).split(";");
     
    		for (String str : elements) {
    			chargerProp(tab[i]);
    			valeur = prop.getProperty(str);
    			ht.put(str, valeur);
    		}
    		al.add(new Fichier(tab[i], ht));
    	}
    }

    Merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Par défaut
    Que te renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(prop.getProperty(nomFichierSansExtension[0]));
    ?

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Sinon c'est amusant de charger des properties comme ça
    Tu ne connais pas ResourceBundle.getBundle("myProperties"); ?

    Mais bon si ton fichier n'existe pas (java.io.FileNotFoundException), vu que tu catch que IOException et que tu n'en fais rien, tu continues et ça fait un null pointeur sur ta ligne de split.

    Je ne sais pas trop ce que tu veux faire, mais c'est bien lourd comme code.
    Un properties ça se lit pas avec un FileInputStream.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    une chaine de caractères contenant des mots séparés par des ;
    Typiquement : serveur1.was;serveur2.was;serveur3.was

    Cela correspond aux clés d'un autre fichier de propriété que je lis après.
    C'est pourquoi je souhaite couper cette chaine à l'aide de split(), pour disposer de chaque élément dans un tableau de String (mon tableau elements[] ).

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Laisse moi deviner ?
    Tu vas parcourir ton tableau de clé pour voir si elle existe après, c'est ça ?

    Tu sais que dans ResourceBundle tu as des méthodes qui font un acces direct à tes clés, comme containsKey() et plein d'autres ...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Par défaut
    Tu ne devrais pas avoir ce NullPointerException. C'est assez étrange.
    Sinon Jimmy a raison, tu te prendrais moins la tête avec un RessourceBundle.

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Citation Envoyé par Skypiea Voir le message
    Tu ne devrais pas avoir ce NullPointerException. C'est assez étrange.
    Si si quand ton fichier n'existe pas tu tombes en NullPointeur car FileNotFound n'est pas catché.
    Pour bien faire les choses, il faut que ta méthode chargerprop retourne un booléen par exemple qui dit si ça s'est bien passé ou pas, et doit catcher toutes les exceptions des io de java.
    Reste qu'on utilise pas les properties de cette manière.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Non, elle existe forcément, puisque je le récupère dans le fichier properties.

    je décompose mon code :
    déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    String[] nomFichierSansExtension;
    String valeur;
    ArrayList<Fichier> al = new ArrayList<Fichier>();
    String[] tab = {"fichier.cfg","fichier1.cfg","fichier2.properties","fichier3.properties" };
    Hashtable<String, String> ht = new Hashtable<String, String>();
     
    Properties prop = new Properties();
     
    private static void chargerProp(String nomFichier) {
    	try {
    		FileInputStream in = new FileInputStream(nomFichier);
    		prop.load(in);
    		i.close();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }
    Dans un premier temps, je récupère les noms de fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i = 0; i < tab.length; i++) {
    	// on obtient fichier par exemple
    	nomFichierSansExtension = tab[i].split("\\.");
    ensuite, je lis le contenu de donnees.properties (qui ressemble à ça :
    fichier=serveur1.was;serveur2.was
    fichier2=serveur2.bdd;serveur3.bdd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chargerProp("donnees.properties");
    puis je veux insérer dans un tableau de string les éléments contenus dans ces fichiers (par exemple fichier.cfg et fichier2.properties), mais c'est à cette ligne que ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String [] elements = prop.getProperty(nomFichierSansExtension[0]).split(";");
    A la suite de ça, je parcoure chaque élément du tableau element
    pour récupérer la valeur, et rentrer dans un Hashtable l'ensemble clé-valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (String str : elements) {
    	chargerProp(tab[i]);
    	valeur = prop.getProperty(str);
    	ht.put(str, valeur);
    }
    C'est un peu lourd, mais j'ai besoin de ça pour rendre mon application paramétrable, lorsqu'on change une valeur des fichiers properties.

    Je ,n'ai pas entendu parler de RessourceBundle, j'ai jetté un coup d'oeil à la doc, mais on l'utilise dans quel cas?

    Merci

  12. #12
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Citation Envoyé par floctc Voir le message
    mais c'est à cette ligne que ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String [] elements = prop.getProperty(nomFichierSansExtension[0]).split(";");
    Passe en debug, il y a rien de magique.

    Soit prop est null, soit le getProperty revoie null et c'est le split qui plante.

    Décompose tes actions en 3 lignes tu verras bien :

    truc1 = prop;
    truc2 = truc1.getProperty ...
    truc3 = truc2.split ...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Bonjour, j'ai réussi à m'en sortir finalement.

    Mais j'aimerai avoir plus d'informations concernant le RessourceBundle.
    J'ai regardé la doc java, et apparemment, c'est surtout utilisé pour les programmes multilingues.

    Pourquoi est-ce déconseillé d'utiliser fileInputStream pour lire un fichier properties?

    Quels avantages propose le RessourceBundle?

    Merci

  14. #14
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Le premier et non des moindres : ne pas tout recoder

    Ensuite, oui tu as notamment le multilinguisme (qui peut être utilisé à d'autres fins, après tout ça définit une correspondance "code / message").

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    La pour le coup, ça me fera tout recoder une première fois!
    Mais si pour la suite c'est mieux, je vais aller lire des tutos qui en parlent.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/11/2012, 23h40
  2. Réponses: 6
    Dernier message: 18/11/2012, 15h01
  3. problème sur tableau de string
    Par boboss123 dans le forum C
    Réponses: 7
    Dernier message: 13/02/2012, 11h41
  4. [Tableau] NullPointerException sur les tableaux
    Par zsoh dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 18/01/2010, 17h42
  5. Suppression et décalage sur un tableau de String
    Par allstar dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/05/2008, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo