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 :

cannot be resolved to a variable and OutOfBoundsException


Sujet :

avec Java

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut cannot be resolved to a variable and OutOfBoundsException
    Bonjour à tous,

    Ceci est mon premier essai de code java :-)

    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
    46
    47
    48
    package TP;
     
    import java.util.Scanner;
     
     
    public class temperature_conversion {
     
    	public static void main(String[] args) {
     
    		Scanner sc = new Scanner(System.in);	
     
    		char again;
     
    		do {		
    			int str=0;
    			again = 'I';
     
    			while ((str != 1) && (str != 2)){
    				System.out.println("Choisissez le mode de conversion :");
    				System.out.println("1 : Convertisseur Celsus - Fahrenheit");
    				System.out.println("2 : Convertisseur Fahrenheit - Celsus");
    				str = sc.nextInt();
    			}
     
    			System.out.println("Temperature à convertir : ");
    			double temperature = sc.nextDouble();
     
    			if (str == 1){
    				double conv_temp = 9.0 / 5.0 * temperature + 32.0;
    				System.out.println(temperature + " °C correspond à " + conv_temp + " °F");	
    			}
    			else {
     
    				double conv_temp = ((temperature - 32.0) * 5.0) / 9.0;
    				System.out.println(temperature + " °F correspond à " + conv_temp + " °C");			
    			}
     
    			while ((again != 'O') && (again != 'N')){
    				System.out.println("Voulez-vous recommencer (O/N) ?");
    				again = sc.nextLine().charAt(0);
    			}
     
    		}while (again != 'N');	
     
    		System.out.println("Aurevoir et bonne journée.");
                    sc.close();
    	}
    }
    (source : tutoriel de Cyrille Herby)

    Mes questions :
    1) again cannot be resolved to a variable (dernier while)
    par des recherches sur le net, je tombe sur le fait que cette variable est hors de portée du while
    2) message d'erreur :
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at TP.temperature_conversion.main(temperature_conversion.java:39)
    par des recherches sur le net, OutOfBoundsException peut venir d'une valeur NULL ... or ici, ça n'est pas bon cas.


    D'avance merci pour votre aide,
    -- Jasmine --

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello,

    Ok, voyons un peu comment aborder ça.

    Citation Envoyé par Jasmine80 Voir le message
    1) again cannot be resolved to a variable (dernier while)
    par des recherches sur le net, je tombe sur le fait que cette variable est hors de portée du while
    C'est effectivement pour cette raison que tu aurais cette erreur-là...
    Mais dans le code que tu nous montres, la variable again est bien à portée du while, et cette erreur n'apparaît pas.

    Citation Envoyé par Jasmine80 Voir le message
    2) message d'erreur :
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at TP.temperature_conversion.main(temperature_conversion.java:39)
    par des recherches sur le net, OutOfBoundsException peut venir d'une valeur NULL
    Absolument pas... null provoquerait NullPointerException et pas autre chose.

    Citation Envoyé par Jasmine80 Voir le message
    ... or ici, ça n'est pas bon cas.
    Ma foi c'est vrai, mais je me demande : comment le sais-tu ?
    Si tu sais que ce n'est pas null, c'est que tu sais que c'est autre chose, n'est-ce pas ? Alors quel est cet autre chose ?

    Cette erreur, qui est un StringIndexOutOfBoundsException et non pas un OutOfBoundsException, apparaît pour... la raison qu'elle donne : "String index out of range: 0"
    Tu as demandé sc.nextLine().charAt(0), et cet index, 0, n'existe pas dans la String obtenue avec sc.nextLine(). Ce qui veut dire que cette String ne contient aucun caractère.
    Reste à voir pourquoi.

    Quand on utilise un Scanner, il faut éviter de mélanger les nextLine() et les next-autre-chose(). Parce que les next-autre-chose() ne consomment pas une ligne entière, et donc, c'est le prochain nextLine() qui s'occupera de consommer ce qui reste de la ligne... C'est-à-dire juste la fin de ligne, ce qui dira donc ce qu'il y avait avant cette fin de ligne, c'est-à-dire rien, String de longueur zéro.

    Je te conseille de remplacer par juste next().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour Thelvin,


    Je te remercie pour ta réponse.

    Citation Envoyé par thelvin Voir le message
    C'est effectivement pour cette raison que tu aurais cette erreur-là...
    Mais dans le code que tu nous montres, la variable again est bien à portée du while, et cette erreur n'apparaît pas.
    Oui, de fait, en déclarant ma variable avant la boucle, l'erreur a disparu, je ne l'avais pas remarqué.


    Citation Envoyé par thelvin Voir le message
    Ma foi c'est vrai, mais je me demande : comment le sais-tu ?
    Si tu sais que ce n'est pas null, c'est que tu sais que c'est autre chose, n'est-ce pas ? Alors quel est cet autre chose ?
    J'ai initialisé 'again' avec une valeur 'I' par défaut, 'again' ne peut donc pas être nul.

    Citation Envoyé par thelvin Voir le message
    Cette erreur, qui est un StringIndexOutOfBoundsException et non pas un OutOfBoundsException, apparaît pour... la raison qu'elle donne : "String index out of range: 0"
    Tu as demandé sc.nextLine().charAt(0), et cet index, 0, n'existe pas dans la String obtenue avec sc.nextLine(). Ce qui veut dire que cette String ne contient aucun caractère.
    Reste à voir pourquoi.
    J'obtiens à l'écran la question 'Voulez-vous recommencer (O/N) ?', puis immédiatement l'erreur, sans avoir l'occasion de la saisir. Comme tu l'expliques, parce qu'elle récupère automatiquement le reste vide du précédent next.

    Citation Envoyé par thelvin Voir le message
    Quand on utilise un Scanner, il faut éviter de mélanger les nextLine() et les next-autre-chose(). Parce que les next-autre-chose() ne consomment pas une ligne entière, et donc, c'est le prochain nextLine() qui s'occupera de consommer ce qui reste de la ligne... C'est-à-dire juste la fin de ligne, ce qui dira donc ce qu'il y avait avant cette fin de ligne, c'est-à-dire rien, String de longueur zéro.
    Je te conseille de remplacer par juste next().
    Je comprends l'idée, merci pour ce conseil. Quand tu dis 'next-autre-chose()', 'nextInt()' en fait partie et dans 'nextLine().charAt(0)' ... la ligne entière est bien consommée, car le charA(0) vient après la consommation ?

    Par exemple ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    				System.out.println("1 : Convertisseur Celsus - Fahrenheit");
    				System.out.println("2 : Convertisseur Fahrenheit - Celsus");
    				str = sc.nextInt();
    Pour éviter 'nextInt()', je peux également utiliser utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = sc.nextLine().charAt(0);
    et traiter 1 et 2 comme des caractère. Est-ce bien une (mauvaise) solution ?
    et idem pour 'double temperature = sc.nextDouble();'. Je peux récupérer 'temperature' comme un caractère alphanumérique et le transformer en double après.


    En conclusion :
    -----------------

    Si j'ai bien compris, soit, je n'utilise que des nextLine(), soit je n'en utilise aucun.
    Si je veux n'en utiliser aucun, je peux utiliser un next() au lieu du dernier 'nextLine()' utilisé. Je peux également utiliser 1 ou 2, comme au début, avec un sc.nextInt().

    Nouveau code, qui fonctionne :
    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
    46
    47
    48
    49
    50
    package TP;
     
    import java.util.Scanner;
     
     
    public class temperature_conversion {
     
    	public static void main(String[] args) {
     
    		Scanner sc = new Scanner(System.in);	
     
    		int again;
     
    		do {		
    			int str=0;
    			again = 0;
     
    			while ((str != 1) && (str != 2)){
    				System.out.println("Choisissez le mode de conversion :");
    				System.out.println("1 : Convertisseur Celsus - Fahrenheit");
    				System.out.println("2 : Convertisseur Fahrenheit - Celsus");
    				str = sc.nextInt();
    			}
     
    			System.out.println("Temperature à convertir : ");
    			double temperature = sc.nextDouble();
     
    			if (str == 1){
    				double conv_temp = 9.0 / 5.0 * temperature + 32.0;
    				System.out.println(temperature + " °C correspond à " + conv_temp + " °F");	
    			}
    			else {
     
    				double conv_temp = ((temperature - 32.0) * 5.0) / 9.0;
    				System.out.println(temperature + " °F correspond à " + conv_temp + " °C");			
    			}
     
    			while ((again != 1) && (again != 2)){
    				System.out.println("Voulez-vous recommencer ?");
    				System.out.println("1 : Oui");
    				System.out.println("2 : Non");
    				again = sc.nextInt();
    			}
     
    		}while (again != 2);	
     
    		System.out.println("Aurevoir et bonne journée.");
    		sc.close();
    	}
    }
    Comment aurais-tu utilisé une next() ? Je vais me renseigner, je ne connais pas encore le next() seul.

    Merci beaucup.
    -- Jasmine --

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    J'ai initialisé 'again' avec une valeur 'I' par défaut, 'again' ne peut donc pas être nul.
    Hélas, la variable "again" n'avait rien à voir avec le problème.

    Citation Envoyé par Jasmine80 Voir le message
    Quand tu dis 'next-autre-chose()', 'nextInt()' en fait partie et dans 'nextLine().charAt(0)' ... la ligne entière est bien consommée, car le charA(0) vient après la consommation ?
    Je ne comprends pas la question, malheureusement. En tout cas, charAt() n'a pas d'effet sur le reste.

    Citation Envoyé par Jasmine80 Voir le message
    Pour éviter 'nextInt()', je peux également utiliser utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = sc.nextLine().charAt(0);
    et traiter 1 et 2 comme des caractère. Est-ce bien une (mauvaise) solution ?
    Ma foi, ça ce n'est pas mal, mais...

    Citation Envoyé par Jasmine80 Voir le message
    et idem pour 'double temperature = sc.nextDouble();'. Je peux récupérer 'temperature' comme un caractère alphanumérique et le transformer en double après.
    Ça par contre c'est tiré par les cheveux.
    Tu pourrais faire double temperature = Double.parseDouble(sc.nextLine()); mais c'est pas très satisfaisant comparé à sc.nextDouble() et la virgule n'est pas gérée pareil.
    Une autre approche est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double temperature = sc.nextDouble();
    sc.nextLine();
    Tu mets un nextLine() juste après dans le seul but de consommer la fin de ligne.

    Citation Envoyé par Jasmine80 Voir le message
    Si j'ai bien compris, soit, je n'utilise que des nextLine(), soit je n'en utilise aucun.
    Ouaip, c'est l'idée. En considérant qu'en appelant nextLine() juste après nextDouble() et consorts, c'est comme si tu utilisais que des nextLine().

    Citation Envoyé par Jasmine80 Voir le message
    Comment aurais-tu utilisé une next() ? Je vais me renseigner, je ne connais pas encore le next() seul.
    Quand je disais d'utiliser next() à la place de nextLine(), je voulais dire littéralement. Tu gardes le même code en remplaçant l'un par l'autre.
    nextLine() lit jusqu'à la fin de la ligne. next() consomme les blancs jusqu'à trouver du contenu, et lit ce qu'il y a jusqu'au prochain blanc.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tu mets un nextLine() juste après dans le seul but de consommer la fin de ligne.
    A c'est une super astuce ça !


    Citation Envoyé par thelvin Voir le message
    Quand je disais d'utiliser next() à la place de nextLine(), je voulais dire littéralement. Tu gardes le même code en remplaçant l'un par l'autre.
    nextLine() lit jusqu'à la fin de la ligne. next() consomme les blancs jusqu'à trouver du contenu, et lit ce qu'il y a jusqu'au prochain blanc.
    J'ai bien compris merci

    Citation Envoyé par thelvin Voir le message
    Tu mets un nextLine() juste après dans le seul but de consommer la fin de ligne.
    Avec : nextLine().charAt(0)
    Je veux dire qu'en premier, on effectue un nextLine(), puis sur ce next line un charAt(0), mais que ce charAt(0) étant exécuté individuellement du nextLine(), l'effet de nextLine(), de consommer tous les caractères, est bien efficient. Admettons que j'ai le mot 'Arbre', le charAt(0) récupère le 'A', mais les autres lettres ont bien été 'vidées' par le nextLine(). Est-ce que c'est clair dit ainsi ? Sinon, j'ai bien compris que la réponse est oui. Donc, ce n'est pas important.

    Merci beaucoup pour ton aide.
    -- Jasmine --

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/05/2013, 19h32
  2. Erreur "R cannot be resolved to a variable"
    Par katze dans le forum Android
    Réponses: 2
    Dernier message: 19/02/2013, 17h19
  3. Erreur "R cannot be resolved to a variable"
    Par Fooshi dans le forum Android
    Réponses: 3
    Dernier message: 21/01/2013, 19h41
  4. Réponses: 3
    Dernier message: 30/11/2012, 12h13
  5. Erreur "cannot be resolved to a variable"
    Par Stefyaounde dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 10/08/2012, 10h08

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