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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 38
    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 ?

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