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

Langage Java Discussion :

ArrayIndex OutOfBounds Exception


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut ArrayIndex OutOfBounds Exception
    Bonjour,

    Bon, ce genre d'erreur c'est vraiment chiant. D'autant plus quand vous effectuez une opération d'un côté, que ça fonctionne nickel et que de l'autre, vous faites pareil et que ça ne va plus. Explication:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Socket connexion = service.accept();
                BufferedReader entree = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
                PrintWriter sortie=new PrintWriter(connexion.getOutputStream(), true);
                str=entree.readLine();
                System.out.println("Et meme encore avant");
                args[0].toString();  //Ligne inutile mais bon, j'ai essayé
                args[0]= args[0].substring(args[0].indexOf('-') + 1); //ICI ÇA PLANTE
                System.out.println(args[0]);
                //options = new ArrayList(Arrays.asList(param.split("")));
     
                options = new ArrayList(Arrays.asList(args[0].split("")));
    Voilà, dans le code je vous ait mis l'endroit où ça plante.

    Alors la classe d'où ce bout de code vient, reçoit:
    -a
    Et mon but est d'isoler 'a', de n'avoir plus que 'a' dans args[0]. Je fais exactement la même opération dans une autre classe et là aucune exception n'est déclenchée, tout fonctionne bien. Mais ici :S

    tiens d'ailleurs voilà ce que je fais dans cette autre classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String param = args[0].toString();
    param= param.substring(param.indexOf('-') + 1);
    options = new ArrayList(Arrays.asList(param.split("")));
    Ca ressemble quand même beaucoup non ?!

    Pourtant d'un côté ça marche, de l'autre non...

    Voici l'erreur générée par le code foireux:
    Exception in thread "main" java.lang.ArrayIndeOutOfBoundsException: 0
    Please Help me.
    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Par défaut
    Salut,

    Je ne crois pas que ton code soit foireux mais plutôt que le tableau args est vide.
    Est-ce que ton flux d'entrée n'est pas plutôt stocké dans ta variable str ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Ouaip, copie/colle toute la méthode, et la déclaration de args si elle est à l'extérieur de cette méthode.

  4. #4
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Tu es sur que dans les 2 main dont tu nous montre le code le String [] en paramètre s'appelle les 2 fois args ?

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Alors désolé de répondre si tard. Je n'ai pas internet chez moi pour l'instant, juste au boulot, de lundi à vendredi donc.

    Merci pour vos réponses.

    Alors...

    nono_31
    Salut,

    Je ne crois pas que ton code soit foireux mais plutôt que le tableau args est vide.
    Est-ce que ton flux d'entrée n'est pas plutôt stocké dans ta variable str ?
    Ha... oui... quel con... On dirait que le soucis vient de là effecitvement. Je viens de faire un test en ramplaçant mes ' args[0]' par 'str' et là ça passe.

    Allez savoir pourquoi, je pensais que c'était pas parce que je stockais la ligne dans 'str' que 'args[0]' étais pour autant vide o_O.

    Tu es sur que dans les 2 main dont tu nous montre le code le String [] en paramètre s'appelle les 2 fois args ?
    Oui oui des deux côtés c'est argS ^^.

    Ouaip, copie/colle toute la méthode, et la déclaration de args si elle est à l'extérieur de cette méthode.

    Hé bien actuellement je semble être débloqué. Donc c'est que les messages passent mais bon, évidemment y'a des choses qui bugent, mais je vais modifier ça. Je vais sûrement bloquer vite sur un truc. J'ai du modifier toute mon application et faire BEAUCOUP de changements pour que j'ai un truc qui logiquement devrait tourner/fonctionner. Et ce petit prob que je vous ait exposé n'est à mon avis que le premier. J'ai sûrement dû faire d'autres erreurs que j'aurai du mal à résoudre sans votre aide.

    Je vous tiens au courant.

    Merci encore.

    M'en vais de ce pas modifier tout mon code

    A bientôt.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    UP, encore un soucis, plus gênant celui-ci.

    Toujours sur application client serveur.

    Voici ce que j'envoie au serveur(le code):
    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
     
    else if(options.contains("v"))
                            {
                                String message=args[0];  //mes arguments en ligne de commande
                                sortie.println(message); //sortie est mon flux de d'envoie vers le server
                                do 
                                {
                                    reponseDuServeur = entreeDepuisServeur.readLine();
                                    //entreeDepuisServeur est mon flux d'entrée...                                
                                    reponseVerbose=reponseDuServeur.substring(0,2); //<= "$$" ou "Co". Pour la gestion du mode Verbose, 
                                   //c'est le seul moyen que j'ai trouvé pour faire un truc facile. Le serveur envoie TOUT 
                                  //et côté client, on trie selon ce qu'on à besoin, on affiche que la ligne nécessaire...
                                    if(reponseVerbose.compareToIgnoreCase("$$")==0)
                                    {
                                        System.out.println(reponseDuServeur.substring(2));
                                    }
                                }
                                while(reponseDuServeur.isEmpty()==false);
                            }
    Et voici côté serveur ce qui est envoyé:
    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
     
    if(command2!=null && options.contains("s"))
                {
                    sortie.println("Status of Database "+command2+" :");
                    String dbs = ans.getDB_Type(command2);
                    String[] dbs2 = dbs.split(":");
                    String serv = ans.getMachine(command2);
                    String[] servs = serv.split(":");
                    //status d'une db en particulier.
                    String stat = ans.getStatus(command2);
                    String[] stats = stat.split(":");
                    time = ans.getStatusTime();
     
                    sortie.println(time+" - "+command2+" : "+stats[1]);
                    sortie.println("$$"+time+" - Status of the"+dbs2[1]+" instance "+command2+"(on"+servs[1]+")"+":"+stats[1]);
                    sortie.println("\n");  //pour être sûr de terminer le flux.
                    // Normalement le sortie.println ajoute déjà un \n à la fin d'une ligne 
                   //envoyée, mais bon... t'façon que je le mette ou pas ce "sortie.println("\n")", ça ne change rien. 
                }
    Le flux de sortie qui commence par 'time' correspond à la ligne qu'on est censé à afficher côté client quand on veut visionner une simple réponse du serveur.
    Celui commençant par '$$' est la réponse en verbose. Réponse plus complète.
    Côté client quand je reçois une telle chaîne je tronque les deux premiers caractères pour afficher la ligne "verbose" sans les '$$'.

    Ca paraît un peu null comme façon de faire, mais c'est ce que j'ai trouvé de plus facile à faire.

    Seulement j'ai une exception qui est levée côté client à la fin de l'envoi des lignes par le serveur.

    java.lang.StringIndexOutOfBoundsException: String index out of range : 2
    Cette erreur n'apparait plus lorsque du côté client, je ne m'amuse pas à isoler les deux premiers caractères de chaque ligne envoyée par le serveur. Evidemment si je vire ce test, tout ce qui est renvoyé par le serveur est affiché et ce n'est pas le but. Vous avez compris le dilemme.

    C'est pas que c'est ennuyant comme erreur. Car le serveur envoi tout, et le client affiche tout ce qu'il doit, tout le temps, sauf que à chaque fois, il plante (exception) une fois qu'il à tout affiché.

    Vous avez une solution ?

    (Ouais je sais je suis lourd avec toutes mes questions )
    Merci :-)

  7. #7
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Est-ce que ce ne serait pas dû au "println(\n)" du serveur ? En effet, tu fais un readline, donc j'imagine que tu récupères bien ce \n mais ça ne représente pas 2 caractères, d'où le plantage lors du substring. Qu'en penses-tu ?

  8. #8
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Sinon, pour ce qui est du protocole de causerie entre le client et le serveur, pourquoi ne pas arrêter les "readline" côté client et ne lire que le nécessaire ?

    Ex : côté serveur, tu construis ta réponse (ex : "coucou").
    Tu y préfixes la taille de cette chaine sur 5 caractères par exemple (ici, ça donne donc "00006coucou").

    Tu sauras ainsi, côté client, qu'il faudra d'abord lire ces 5 caractères (via 5 "read()"), caster ça en int puis faire une boucle de read() allant de 0 à 4.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Citation Envoyé par DevTeam_ Voir le message
    Est-ce que ce ne serait pas dû au "println(\n)" du serveur ? En effet, tu fais un readline, donc j'imagine que tu récupères bien ce \n mais ça ne représente pas 2 caractères, d'où le plantage lors du substring. Qu'en penses-tu ?
    Bhein le truc c'est que, que je mette ou pas la ligne "sortie.println("\n")", ça ne change strictement rien au résultat. Toujours la même erreur.

    Je sais (parce que j'ai viré la ligne pour essayer) que le problème vient du substring que je fais côté client (ça doit induire une passage en plus dans la boucle ou je sais pas trop, c'est ça le pire, c'est que ça me paraît pas normal...).

    Concernant le "protocole de causerie", ce que j'ai fait fonctionne très bien. En fait. Mais bon... Puis ta méthode me paraît extrêmement compliquée ^^

  10. #10
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    Ca vient peut-etre de ta boucle do while, en effet le dernier readline peut te retourner une ligne vide, mais tu vas faire ton .substring avant de tester si ta réponse du serveur est vide...

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Problème résolu.

    Et encore une fois, la solution est toute bête:

    Ajouter un test...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    do 
    {
        reponseDuServeur = entreeDepuisServeur.readLine();
        if(reponseDuServeur.isEmpty()==false)
        {    
            reponseVerbose=reponseDuServeur.substring(0,2);
            if(reponseVerbose.compareToIgnoreCase("$$")==0)
            {
                sortie.println(reponseDuServeur.substring(2));
            }
        }
    }
    while(reponseDuServeur.isEmpty()==false);
    En fait suffit de vérifier qu'on à bien lu quelque chose avant de substring la chaîne. Si y'a plus rien le substring est évité et ne génère plus de repassage dans la boucle (je suppose que c'est ça, mais c'est toujours pas logique).

    Donc:

    0)On boucle
    1)On lit le flux
    2)On test qu'il n'est pas vite
    3)On traite la réponse du serveur
    4)On affiche selon le besoin
    0 bis)On termine la boucle do-while sur un test du flux (vide ou pas).

    Et comme ça ça fonctionne. Mais je crois que mon cas est isolé.

    J'dois avoir merdé quelque chose dans mon code. Mais pas là. Ce qui faisait que la boucle s'exécutait une fois de trop tout le temps.

    Halala.

    En tout cas merci.

  12. #12
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    C'est ce que je disais, c'est le probleme du repeat, la condition n'est testée qu'après le traitement. La boucle while semble plus adaptée à ton cas, d'autant que dans ta solution tu testes 2 fois par itération la même condition

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Il est vrai... :/

Discussions similaires

  1. java.lang.StringIndex OutOfBounds Exception
    Par omar344 dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 14/11/2009, 16h34
  2. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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