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

  1. #1
    Candidat au Club
    Femme Profil pro
    numerique
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : numerique

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 4
    Points
    4

    Par défaut Problème avec un substring apparemment out of bounds mais je ne comprends pas pourquoi

    Bonjour,
    je débute juste en java et j'ai un soucis avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
    		Scanner scan = new Scanner(System.in);
    		String mot;
    		System.out.println("Quel est le mot à tester ?");
    		scan.nextLine();
    		mot = scan.nextLine();
    		scan.close();
    		mot.length();
    		int n = mot.length();
    		String s1 = mot.substring(1, (n - 1));
    }
    J'ai l'erreur Exception in thread "main"
    java.lang.StringIndexOutOfBoundsException: String index out of range: -2
    at java.lang.String.substring(Unknown Source)
    at tp3.Exo3.main(Exo3.java:16)
    mais je ne comprends pas car je rentre des chaines de caractères toujours assez longues comme " abcdef"...
    J'ai fait un test avec une chaîne de caractère en dur et ça fonctionne bien, quelqu'un saurait d'où vient l'erreur ?
    Merci d'avance!!

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 576
    Points : 19 650
    Points
    19 650

    Par défaut

    Hello,

    est-ce vraiment voulu d'appeler deux fois scan.nextLine() et de ne rien faire avec la première ?
    Ça m'a tout l'air d'une erreur et de la cause de tes problèmes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 11 459
    Points : 26 879
    Points
    26 879
    Billets dans le blog
    2

    Par défaut

    Salut,

    nextLine(), ça consomme ce qu'il y a dans le tampon jusqu'au prochaine "newline", donc tout ce qui a été saisi jusqu'au premier "retour chariot". S'il n'y a rien de tel à consommer, ça attends qu'il y ait quelque chose à consommer, donc qu'on saisisse quelque chose.

    Tu fais un premier nextLine() qui attend/consomme une première saisie, puis un second qui attend/consomme un seconde saisie, et qui la met dans la variable mot. La première saisie est perdue. Tu as d'ailleurs te rendre compte que tu étais obligé de taper deux fois sur entrée.

    Si on saisit abcd puis entrée, puis entrée, tu as cette erreur, parce que la chaîne fais 0 (la seconde).
    Si on saisit abcd puis entrée, puis efgh puis entrée, tu n'auras plus cette erreur, parce que la var mot contient efgh.
    Si on saisit entrée, puis abcd puis entrée, tu n'auras pas non plus cette erreur.

    Pourquoi faire le premier nextLine() ?

    En revanche, de toute manière, tu devrais tester si mot est suffisant grand pour faire le substring, car rien n'empêche personne de saisir une chaîne de 1 caractère ou moins.
    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.

  4. #4
    Candidat au Club
    Femme Profil pro
    numerique
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : numerique

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 4
    Points
    4

    Par défaut

    Bonjour, merci beaucoup, en effet c'est le scanLine seul qui m'empechait de faire fonctionner mon code.
    Je l'avais mis car dans un autre code, justement le scanLine ne fonctionnait pas et on m'avait dit de le mettre tout seul avant pour le faire fonctionner..
    Pour la longueur de la chaine je vais la verifier merci beaucoup du conseil.
    Bonne continuation.
    Eelloo

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/02/2017, 23h19
  2. Réponses: 0
    Dernier message: 05/08/2015, 12h18
  3. Problème avec string::substr()
    Par spirzouf dans le forum Débuter
    Réponses: 4
    Dernier message: 08/11/2011, 14h10
  4. Réponses: 4
    Dernier message: 08/01/2008, 00h48
  5. Problème avec un substring
    Par yoda_style dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 12h29

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