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

avec Java Discussion :

Erreur de type java.lang.ArrayIndexOutOfBoundsException


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Par défaut Erreur de type java.lang.ArrayIndexOutOfBoundsException
    Bonjour, j'essaye de faire fonctionner un projet importé sans avoir de véritables connaissances du java. J'ai une erreur que j'ai retrouvée présentée plusieurs fois sur internet, apparemment liée à la taille d'un tableau. Néanmoins je ne vois quelle résolution appliquer.

    La portion de code incriminée :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package fr.guehenneux.wordgen;
     
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    import java.util.stream.Stream;
     
    /**
     * Based on sciencetonnante video
     * https://www.youtube.com/watch?v=YsR7r2378j0
     * 
     * @author Jonathan Guéhenneux
     */
    public class WordGenerator {
     
    	private static final char NULL_CHARACTER = 0;
    	private static final Random RANDOM = new Random();
     
    	/**
             * @param arguments
             * @throws IOException
             */
    	public static void main(String[] arguments) throws IOException {
     
    		String dictionaryPath = arguments[0];
    		int windowSize = Integer.parseInt(arguments[1]);
    		int wordLength = Integer.parseInt(arguments[2]);
    		int wordCount = Integer.parseInt(arguments[3]);
     
    		WordGenerator wordGenerator = new WordGenerator(dictionaryPath, windowSize);
     
    		int generatedWordCount = 0;
     
    		while (generatedWordCount < wordCount) {
     
    			System.out.println(wordGenerator.generateRandomWord(wordLength));
    			generatedWordCount++;
    		}
    	}
    L'erreur :

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at fr.guehenneux.wordgen.WordGenerator.main(WordGenerator.java:31)
    J'ai bien sûr essayé d'augmenter la taille d'arguments (encore qu'il me semble que 0 devrait donner une taille flexible ?) et ça ne change rien.

    Voici aussi la source à partir de laquelle j'essaye d'importer le projet : https://github.com/Achaaab/WordGenerator

    Je vous remercie d'avance pour vos conseils.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 584
    Par défaut
    Bonsoir,
    Qans avoir le message d'erreur ça va être dur de trouvé, mais je pense que ton problème vient du tableau arguments. Ton main a besoin de 3 arguments pour se lancer correctement. Il faut donc les passer en.ligne de comandes si tu lances ton appli en console.

  3. #3
    Membre Expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 494
    Billets dans le blog
    8
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		String dictionaryPath = arguments[0];
    		int windowSize = Integer.parseInt(arguments[1]);
    		int wordLength = Integer.parseInt(arguments[2]);
    		int wordCount = Integer.parseInt(arguments[3]);
    Il y a déjà un problème au niveau des tests: il n'y en a pas.

    Avant d'utiliser une ressource chatouilleuse, c'est toujours mieux de vérifier qu'elle est capable de te fournir ce que tu veux. (En java la JVM est sympa, elle va te dire qu'il y a quelque chose qui ne va pas, dans d'autres langages, tu risques de continuer à chercher longtemps )

    Tu pourrais faire, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if(arguments.length == 0 || arguments.length < 4)
    {
        		String dictionaryPath = arguments[0];
    		int windowSize = Integer.parseInt(arguments[1]);
    		int wordLength = Integer.parseInt(arguments[2]);
    		int wordCount = Integer.parseInt(arguments[3]);
    }
    else 
    {
        System.out.print("Chef, on a un problème: ");
        System.out.println("Il n'y a que "+ arguments.length + " au lieu de 4.");
    }
    Et là tu pourras commencer à diagnostiquer d'où vient le problème. (bon, dans ce cas, ça n'ira pas bien loin )

    EDIT:
    Qans avoir le message d'erreur ça va être dur de trouvé
    Le nom de l'exception levée est dans son titre.

  4. #4
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Par défaut
    Ahh oui, pardon, je l'ajoute au premier message, je me disais bien que j'oubliais quelque chose...

    J'en ai profité pour essayer ce que tu proposes, Songbird, et cela génère une erreur différente.

    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    Incompatible operand types String[] and int
    dictionaryPath cannot be resolved to a variable
    Cannot make a static reference to the non-static field windowSize
    wordCount cannot be resolved to a variable
    wordLength cannot be resolved to a variable

    at fr.guehenneux.wordgen.WordGenerator.main(WordGenerator.java:31)
    Si j'ai bien compris, arguments est un tableau plus complexe que je ne l'aurais cru qui fait appel à un certain nombre d'éléments pas ou mal définis ?
    Je me suis peut-être lancé dans une entreprise plus complexe qu'attendu, j'espérais que la ressource fournie sur Github soit utilisable assez facilement.

  5. #5
    Membre Expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 494
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Saheyus Voir le message
    Ahh oui, pardon, je l'ajoute au premier message, je me disais bien que j'oubliais quelque chose...

    J'en ai profité pour essayer ce que tu proposes, Songbird, et cela génère une erreur différente.



    Si j'ai bien compris, arguments est un tableau plus complexe que je ne l'aurais cru qui fait appel à un certain nombre d'éléments pas ou mal définis ?
    Mes excuses, j'ai fait une faute dans l'exemple que je t'ai donné. (je l'ai écrit sans l'avoir compilé)

    Réessaies, tu ne devrais plus avoir d'erreur. (mon message a été édité)

  6. #6
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Par défaut
    Voici le résultat :

    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    dictionaryPath cannot be resolved to a variable
    Cannot make a static reference to the non-static field windowSize
    wordCount cannot be resolved to a variable
    wordLength cannot be resolved to a variable

    at fr.guehenneux.wordgen.WordGenerator.main(WordGenerator.java:44)
    Cela signale d'autres éléments du document, qui se situent juste après.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		WordGenerator wordGenerator = new WordGenerator(dictionaryPath, windowSize);
     
    		int generatedWordCount = 0;
     
    		while (generatedWordCount < wordCount) {
     
    			System.out.println(wordGenerator.generateRandomWord(wordLength));
    			generatedWordCount++;
    		}
    	}

  7. #7
    Membre Expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 494
    Billets dans le blog
    8
    Par défaut
    Là par contre je sèche.
    Généralement, on a ce genre d'erreurs lorsqu'une variable est utilisée dans un scope différent. (statique à dynamique, ou vice versa)

    Essaie de voir de ton côté comment tes attributs sont encapsulés.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par Songbird_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if(arguments.length == 0 || arguments.length < 4)
    {
        		String dictionaryPath = arguments[0];
    		int windowSize = Integer.parseInt(arguments[1]);
    		int wordLength = Integer.parseInt(arguments[2]);
    		int wordCount = Integer.parseInt(arguments[3]);
    }
    else 
    {
        System.out.print("Chef, on a un problème: ");
        System.out.println("Il n'y a que "+ arguments.length + " argument(s) au lieu de 4.");
    }

    Mouais, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(arguments.length >= 4) {// s'il y a au moins 4 arguments, alors on peut "lire" 4 arguments (au moins)
        		String dictionaryPath = arguments[0];
    		int windowSize = Integer.parseInt(arguments[1]);
    		int wordLength = Integer.parseInt(arguments[2]);
    		int wordCount = Integer.parseInt(arguments[3]);
    }
    else { // sinon il y a erreur
        System.out.print("Chef, on a un problème: ");
        System.out.println("Il n'y a que "+ arguments.length + " au lieu de 4.");
    }

    Citation Envoyé par Saheyus Voir le message
    Voici le résultat :

    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    dictionaryPath cannot be resolved to a variable
    Cannot make a static reference to the non-static field windowSize
    wordCount cannot be resolved to a variable
    wordLength cannot be resolved to a variable

    at fr.guehenneux.wordgen.WordGenerator.main(WordGenerator.java:44)
    Le problème est qu'en ayant mis la lecture des arguments dans un bloc (celui du if), les variables déclarées dans le bloc sont devenues locales au bloc, donc non visibles en dehors (et donc non visibles après ).

    Il faudrait mettre le code entier de la méthode dans le bloc du if, puisque de toute manière, s'il n'y a pas les paramètres nécessaires pour faire tourner le programme, il ne faut pas le faire tourner, ni entièrement, ni partiellement.

    Donc :

    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
    19
    20
    21
    22
    23
     
    if(arguments.length >= 4) {// s'il y a au moins 4 arguments, alors on peut "lire" 4 arguments (au moins)
         String dictionaryPath = arguments[0];
         int windowSize = Integer.parseInt(arguments[1]);
         int wordLength = Integer.parseInt(arguments[2]);
         int wordCount = Integer.parseInt(arguments[3]);
     
         WordGenerator wordGenerator = new WordGenerator(dictionaryPath, windowSize);
     
         int generatedWordCount = 0;
     
         while (generatedWordCount < wordCount) {
     
              System.out.println(wordGenerator.generateRandomWord(wordLength));
              generatedWordCount++;
     
        }
     
    }
    else { // sinon il y a erreur
        System.out.print("Chef, on a un problème: ");
        System.out.println("Il n'y a que "+ arguments.length + " argument(s) au lieu de 4.");
    }
    Quant à cette erreur : Cannot make a static reference to the non-static field windowSize. C'est probablement que lorque tu as vu qu'il y avait une erreur du type "windowSize cannot be resolved to a variable", tu as du chercher à la corriger en ajoutant un attribut à la classe, de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class WordGenerator {
    
         int windowSize
    
         public static void main(String[] args) throws IOException {
                  /**...**/
         }
    
    }
    Mais cette variable windowSize n'est visible depuis un code dans la méthode main(), parce que cette variable est un attribut d'instance (chaque instance de la classe a sa propre valeur pour cette variable), alors que la méthode main est static, et donc non attachée à une instance particulière.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/04/2016, 07h30
  2. Erreur : java.lang.ArrayIndexOutOfBoundsException
    Par the watcher dans le forum Langage
    Réponses: 10
    Dernier message: 22/09/2010, 18h56
  3. Erreur java lang.ArrayIndexOutOfBoundsException
    Par lerorodu51 dans le forum NetBeans
    Réponses: 8
    Dernier message: 04/06/2009, 19h17
  4. erreurs de type java.lang.NullPointerException
    Par laposte dans le forum Servlets/JSP
    Réponses: 17
    Dernier message: 06/04/2009, 19h45
  5. Erreur d'exécution de type java.lang.NoClassDefFoundError
    Par lelorf1983 dans le forum JDeveloper
    Réponses: 3
    Dernier message: 01/06/2007, 15h20

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