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 en lecture de caractères [Débutant(e)]


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Erreur en lecture de caractères
    Bonjour

    Je vous mets tout (puisque cela me sert pour avoir un récapitulatif de JAVA) mais le problème est juste à la fin: j'ai le message " String index out of range: 0
    at java.lang.String.charAt(Unknown Source)"
    Pourquoi donc ?

    Merci


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    import java.util.Scanner;
     
     
    public class AfficheTension {
     
    	public static void main(String[] args) {
    		//définition des variables
    		byte valeur8Bits=11;
    		int valeurInt=0,x=0,y=0;
    		double resultat=0; //pour autoriser nbre a virgule
    		char lettreReponse='O';
    		String chaineResultat = new String();
    		Scanner sc = new Scanner(System.in); // importe classe scanner pour clavier
    		// pour importer toutes classes util: import java.util (en début)
    		// byte= -128 a +128 ,hexa = 0xFF, binaire= 0b00010101
    		// boolean= 8 bits
    		// short  = 16 bits signés = -32768 à +32767
    		// int    = 32 bits signés
    		// long   = 64 bits flottant
    		// float  = 64 bits flottant
    		// double = 64 bits flottant
    		// char   = 16 bits caractère
    		//NB notation: valeur=255 <-> valeur=2_55<-> valeur=2_5_5
     
    		//opération pour obtenir nbre a virgule à partir d'un entier
    		resultat= (double)(valeur8Bits) / 2;  //on convertit ("cas"t) d'abord Valeur8Bits en double
    		System.out.println("ValeurEntiere="+resultat);
     
    		//transfert d'un nombre vers une chaine
    		chaineResultat=chaineResultat.valueOf(resultat);
    		System.out.println("ChaineResultat="+chaineResultat+"\n");
     
    		//entrée d'une chaine
    		System.out.println("Tapez un ou des mots");
    		chaineResultat = sc.nextLine(); //nextLine pour attendre chaine, sc.nextInt pour entier...
    		System.out.println("Vous avez saisi : " + chaineResultat+"\n");
     
    		//entrée d'un nombre
    		System.out.println("Tapez un chiffre");
    		resultat = sc.nextDouble();
    		System.out.println("Vous avez saisi la valeur: " + resultat+"\n");
     
    		//utilisation du if
    		if (resultat>10)  //note  egalité == , et && , ou || 
    		{ //accolade facultative si une seule ligne
    			System.out.println("Supérieur à dix");
    		}
    		else
    		{
    			System.out.println("Inférieur à onze");
    		}
     
    		//utilisation de switch
    		valeurInt=(int) resultat;
    		switch (valeurInt)
    		{
    		case 10:
    			System.out.println("Dix trouvé !!");
    		break; //indique qu'il faut sortir du switch
    		default: // indication du cas "else"
    			System.out.println("Différent de dix");	
    		}
     
    		//utilisation du while
    		while (x<10 && lettreReponse=='O')
    		{
    			System.out.println(x);
    			//utilisation d'une lettre
    			System.out.println("Voulez-vous continuer ? (O/N)");
    			lettreReponse = sc.nextLine().charAt(0);
    			x++;
    		}	
     
     
     
     
    		System.out.println("FIN de AfficheTension ");
    	}
     
    }

  2. #2
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    cette erreur signifie que ton code accède au premier caractère d'une chaîne vide, donc qui n'a pas de caractères, donc à fortiori pas de premier caractère.

    Quand tu saisis le nombre double tu tapes des chiffres (et virgule éventuellement) et tu fais entrée, mais le nextDouble() ne lis pas le retour chariot, qui ne fait pas partie du nombre.

    Du coup, quand le nextLine() dans le while est exécuté, il reste un retour chariot à lire, ce que nextLine() lit comme une chaine vide (car lui saute la prochaine ligne (donc des caractères plus un retour chariot) et retourne ce qu'il a passé, sans le retour chariot). Et cette chaîne vide cause cette erreur.
    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    cette erreur signifie que ton code accède au premier caractère d'une chaîne vide, donc qui n'a pas de caractères, donc à fortiori pas de premier caractère.

    Quand tu saisis le nombre double tu tapes des chiffres (et virgule éventuellement) et tu fais entrée, mais le nextDouble() ne lis pas le retour chariot, qui ne fait pas partie du nombre.

    Du coup, quand le nextLine() dans le while est exécuté, il reste un retour chariot à lire, ce que nextLine() lit comme une chaine vide (car lui saute la prochaine ligne (donc des caractères plus un retour chariot) et retourne ce qu'il a passé, sans le retour chariot). Et cette chaîne vide cause cette erreur.
    Merci pour la réponse

    Donc, si je comprends bien, c'est que la dernière lecture en mode chiffre a généré un code retour chariot (13) qui n'est pas vidé du buffer clavier.
    Dans ce cas comment faire pour vider ce buffer sachant qu'ensuite je peux avoir besoin de lire un caractère ?

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par orphee03 Voir le message
    Donc, si je comprends bien, c'est que la dernière lecture en mode chiffre a généré un code retour chariot (13) qui n'est pas vidé du buffer clavier.

    Non ce n'est la lecture en elle même, c'est le fait de taper un nombre puis entrée, qui fait qu'on a un retour chariot dans le buffer. Et que la lecture du nombre ne lit pas le retour chariot.

    Citation Envoyé par orphee03 Voir le message
    Dans ce cas comment faire pour vider ce buffer sachant qu'ensuite je peux avoir besoin de lire un caractère ?
    il suffit que tu fasses nextLine() avant la boucle while.

    Attention, pour faire un code plus stable (la j'imagine que c'est pour comemncer à apprendre...) tu devrais tester si ta chaîne n'est pas vide avant de faire le charAt(0), sinon ça va aussi planter si l'utilisateur tape entrée, sans taper aucun caractère. Entre autres tests qui seraient utiles de mettre (genre hasDouble() avant de faire directement nextDouble()...).
    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.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Non ce n'est la lecture en elle même, c'est le fait de taper un nombre puis entrée, qui fait qu'on a un retour chariot dans le buffer. Et que la lecture du nombre ne lit pas le retour chariot.


    Citation Envoyé par joel.drigo Voir le message
    il suffit que tu fasses nextLine() avant la boucle while.
    Ok, merci. J'essaie ... ça marche pas ! update: si ça marche, c'est juste que le message identique d'erreur restait affiché en bas mais que j'avais une autre erreur, un "{" de trop. à savoir donc pour la prochaine fois: s'il y a erreur il y a deux façons de l'afficher, soit par le x directement à gauche du programme, soit dans la zone du bas qui, je suppose, ne concerne que l'erreur en cours de fonctionnement. C'est ça ?

    Citation Envoyé par joel.drigo Voir le message
    Attention, pour faire un code plus stable (la j'imagine que c'est pour commencer à apprendre...) tu devrais tester si ta chaîne n'est pas vide avant de faire le charAt(0)
    Ici elle est initialisée à "O" mais je prends note

    Citation Envoyé par joel.drigo Voir le message
    Entre autres tests qui seraient utiles de mettre (genre hasDouble() avant de faire directement nextDouble()...)
    Mais encore ?

  6. #6
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par orphee03 Voir le message


    Ok, merci. J'essaie ... ça marche pas !
    je suis parti du code initial que tu as mis dans ton premier, et moi ça marche. Je vois pas trop pourquoi pas chez toi. (EDIT: ok j'ai vu que tu avais modifié ton message pour dire que ça marchait en fait, mais j'ai pas tout compris sur ton histoire de x et de message d'erreur ) C'est un truc de présentation de fenêtre d'IDE c'est ça ? En théorie si tu as un code qui compile pas sous Eclipse par exemple, que j'utilise perso, (sous NetBeans ou IntellijIdea, ou... je suppose que ce n'est pas très différent), tu as le code en erreur souligné, et une alerte qui te dit que tu peux pas exécuter le code parce qu'il compile pas, et effectivement la console affichée correspond à la dernière exécution (d'un code qui compilait forcément)

    Citation Envoyé par orphee03 Voir le message
    Ici elle est initialisée à "O" mais je prends note
    Je parle pas du char dans lequel tu stockes le premier caractère, mais de la ligne lue par nextLine() qui peut être vide, si on tape entrée sans taper O ou N

    Citation Envoyé par orphee03 Voir le message
    Mais encore ?
    Bah par exemple le test de la lettre "O" ou "N" : imagine que l'utilsateur tape 'Oh!!!' ça va être pris comme 'O' ou tape 'zzzz' ça va pas être pris comme 'O', ou 'o' qui va pas être pris comme 'O'.
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    je suis parti du code initial que tu as mis dans ton premier, et moi ça marche. Je vois pas trop pourquoi pas chez toi. (EDIT: ok j'ai vu que tu avais modifié ton message pour dire que ça marchait en fait, mais j'ai pas tout compris sur ton histoire de x et de message d'erreur ) C'est un truc de présentation de fenêtre d'IDE c'est ça ? En théorie si tu as un code qui compile pas sous Eclipse par exemple, que j'utilise perso, (sous NetBeans ou IntellijIdea, ou... je suppose que ce n'est pas très différent), tu as le code en erreur souligné, et une alerte qui te dit que tu peux pas exécuter le code parce qu'il compile pas, et effectivement la console affichée correspond à la dernière exécution (d'un code qui compilait forcément)


    Je parle pas du char dans lequel tu stockes le premier caractère, mais de la ligne lue par nextLine() qui peut être vide, si on tape entrée sans taper O ou N


    Bah par exemple le test de la lettre "O" ou "N" : imagine que l'utilsateur tape 'Oh!!!' ça va être pris comme 'O' ou tape 'zzzz' ça va pas être pris comme 'O', ou 'o' qui va pas être pris comme 'O'.
    Ok. Je continue à apprendre Java (ça marche vite, je viens de finir le traitement des chaines !)

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

Discussions similaires

  1. thread(erreur de lecture d'un caractère)
    Par khadi8 dans le forum Débuter
    Réponses: 5
    Dernier message: 19/01/2013, 18h03
  2. Réponses: 3
    Dernier message: 19/01/2009, 14h43
  3. Réponses: 18
    Dernier message: 19/10/2005, 14h07
  4. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  5. Erreur de lecture du flux sous SQLServer
    Par smazaudi dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/03/2005, 14h30

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