Partage
  • Partager sur Facebook
  • Partager sur Twitter

Je n'arrive pas à résoudre ce qui cloche.

Problème, merci. =)

Sujet résolu
    16 mars 2012 à 18:43:04

    Bonjour. :)

    J'ai un problème avec la première boucle "do{...}while(...);" (La boucle principale) dans ce code :
    import java.util.Scanner;
    
    public class cf {
    
    	public static void main(String[] args)
    	{
    		Scanner sc = new Scanner(System.in);
    		
    		char rep = ' ';
    		char repa = 'n';
    		
    			System.out.println("Bienvenue dans le programme de convertion en °C/°F\n");
    			do{
    				do{
    			        System.out.println("Convertion de °C ou de °F ? (c/f)");
    			        rep = sc.nextLine().charAt(0);
    				}while (rep != 'c' && rep != 'f');
    				
    				if (rep == 'c')
    				{
    					System.out.print("Celsius : ");
    					double c = sc.nextDouble();
    					double f = ((9*c)/5)+32;
    					System.out.println("");
    					System.out.println(c+ "°C = " +f+ "°F\n");
    				}
    				else
    				{
    					System.out.print("Fahrenheit : ");
    					double f = sc.nextDouble();
    					double c = ((f-32)*5)/9;
    					System.out.println("");
    					System.out.println(f+ "°F = " +c+ "°C\n");
    				}
    					System.out.println("Une autre convertion ? (o/n)");
    					repa = sc.nextLine().charAt(0);
    			}while (repa == 'o');
    	}
    
    }
    

    Juste après "Une autre convertion ? (o/n)" ( ligne 37) éclipse me met ça dans la console :

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at cf.main(cf.java:36)


    J'ai même essayé avec "while{...}", mais en vain. :(
    Pourtant éclipse ne m'affiche pas d'erreurs sur le côté, avant compilation. o_O

    Dites le moi si je ne suis pas assez précis. :p

    Merci beaucoup. ;)
    • Partager sur Facebook
    • Partager sur Twitter
      16 mars 2012 à 19:55:27

      C'est... quoi, le problème ?
      • Partager sur Facebook
      • Partager sur Twitter
      Small is Beautiful — E.F. Schumacher | Blog (fr)
        16 mars 2012 à 20:00:21

        Et bien à partir de "repa = sc.nextLine().charAt(0);" ligne 38, éclipse me met ça dans la console :

        Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
        at java.lang.String.charAt(Unknown Source)
        at cf.main(cf.java:36)


        Juste après "Une autre convertion ? (o/n)"

        Pourtant éclipse ne m'affiche pas d'erreurs sur le côté, avant compilation.

        Et désolé de ne pas avoir été assez précis.

        • Partager sur Facebook
        • Partager sur Twitter
          16 mars 2012 à 20:10:19

          À priori, tu essais de récupérer le caractère zéro sur un string qui n'a pas de caractère zéro. Le bug se produit dans quelle circonstance ? Quand tu appuies sur Entrée sans rien taper ?
          • Partager sur Facebook
          • Partager sur Twitter
          Small is Beautiful — E.F. Schumacher | Blog (fr)
            16 mars 2012 à 20:38:50

            Essaye avec un next() plutôt qu'avec nextLine().charAt(). (je n'ai pas essayé, mais ça me parait la meilleure solution en lisant la doc).
            • Partager sur Facebook
            • Partager sur Twitter
              16 mars 2012 à 20:45:02

              Bonjour,

              Cette exception indique que ta chaîne est vide. Cela vient du scanner qui retient tous les caractères tapés dans un buffer pour ensuite les redonner via les méthodes comme nextDouble(), nextLine(). Si le buffer n'est pas vide, il ne demande rien à l'utilisateur et consomme directement des caractères dans celui-ci.

              Le problème est que lorsque l'utilisateur valide la valeur à convertir, il appuie sur entrée. Le scanner enregistre donc la valeur et un retour chariot. Avec nextDouble(), tu récupère la valeur mais le retour chariot n'est pas consommé.

              Donc lors de l'appel à nextLine(), il consomme ce qu'il reste dans le buffer, c'est à dire le retour chariot. Et comme nextLine() s'arrête au premier retour chariot et renvoie la chaîne consommée sans celui-ci, tu te retrouve avec une chaîne vide. D'où l'exception !

              Pour régler ce problème tu peux simplement faire un appel à nextLine() après nextDouble(), ce qui permettra de consommer tous les caractères gênants.
              • Partager sur Facebook
              • Partager sur Twitter
                16 mars 2012 à 20:57:21

                Bonjour,
                En effet ton problème vient de ta déclaration de Scanner() une seule fois dans le code. et la utiliser plusieurs fois avec différentes variables. :-°
                voici ce que je te propose ;) :

                package fr.test;
                
                import java.util.Scanner;
                
                public class Cf {
                
                	public static void main(String[] args) {
                		char rep = ' ';
                		char repa = 'n';
                
                		System.out
                				.println("Bienvenue dans le programme de convertion en °C/°F\n");
                		do {
                			do {
                				System.out.println("Convertion de °C ou de °F ? (c/f)");
                				rep = new Scanner(System.in).nextLine().charAt(0);
                			} while (rep != 'c' && rep != 'f');
                
                			if (rep == 'c') {
                				System.out.print("Celsius : ");
                				double c = new Scanner(System.in).nextLine().charAt(0);
                				double f = ((9 * c) / 5) + 32;
                				System.out.println("");
                				System.out.println(c + "°C = " + f + "°F\n");
                			} else {
                				System.out.print("Fahrenheit : ");
                				double f = new Scanner(System.in).nextLine().charAt(0);
                				double c = ((f - 32) * 5) / 9;
                				System.out.println("");
                				System.out.println(f + "°F = " + c + "°C\n");
                			}
                			System.out.println("Une autre convertion ? (o/n)");
                			repa = new Scanner(System.in).nextLine().charAt(0);
                		} while (repa == 'o');
                	}
                
                }
                


                j'espere que ça va t'aider :p

                update:
                voila ce que ça donne chez moi :-)
                Bienvenue dans le programme de convertion en °C/°F
                
                Convertion de °C ou de °F ? (c/f)
                c
                Celsius : 12
                
                49.0°C = 120.2°F
                
                Une autre convertion ? (o/n)
                o
                Convertion de °C ou de °F ? (c/f)
                f
                Fahrenheit : 65
                
                54.0°F = 12.222222222222221°C
                
                Une autre convertion ? (o/n)
                n
                • Partager sur Facebook
                • Partager sur Twitter
                  16 mars 2012 à 20:57:47

                  Ça marche nickel, merci beaucoup à tous. :D

                  Et pour répondre à ta question Katastrophe : Sans rien taper. :)

                  Merci.

                  Edit: Ok, merci cYounes. ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 mars 2012 à 21:05:19

                    Citation : cYounes

                    Bonjour,
                    En effet ton problème vient de ta déclaration de Scanner() une seule fois dans le code. et la utiliser plusieurs fois avec différentes variables. :-°
                    voici ce que je te propose ;) :



                    Cette solution n'est pas à suivre. Créer un Scanner pour chaque donnée à lire, ça fait beaucoup ! Il est plus raisonnable de comprendre le fonctionnement du Scanner à base de buffer et l'utiliser en faisant attention aux caractères "cachés".

                    J'ai oublié de préciser à JcC_26 qu'un petit appel à close ne fait pas de mal surtout lorsqu'on utilise des fichiers.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 mars 2012 à 22:17:41

                      Citation : GuiGuiZero



                      Cette solution n'est pas à suivre. Créer un Scanner pour chaque donnée à lire, ça fait beaucoup ! Il est plus raisonnable de comprendre le fonctionnement du Scanner à base de buffer et l'utiliser en faisant attention aux caractères "cachés".



                      Bah oui je sais mais bon , si tu parle au niveau de mémoire, y'a un purgeur par défaut qui va libérer la mémoire de chaque Scanner() une fois on sort de rubrique , i.e après } :-)
                      En plus dans ce exemple il a besoin pour chaque Scanner une et une seule fois , o_O
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 mars 2012 à 22:45:29

                        Même si le garbage collector de Java évite de se retrouver avec plein de Scanner en mémoire, il est quand même préférable d'instancier une seule fois le Scanner. Surtout pour l'utiliser 3 petites fois.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Je n'arrive pas à résoudre ce qui cloche.

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown