Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur avec char

    31 octobre 2022 à 17:06:13

    Bonjour, je suis débutant sur java et je " code" sur eclipse.

    Depuis 3 jours je n'arrive pas à trouver mon erreur sur ce petit programme et c'est pour ça que malgré mes recherches , je me suis décidé à poster.

    package boucles;
    
    import java.util.Scanner;
    
    public class fairedowhile {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		double x;
    		char choix ='O';
    		 
    		
    		Scanner clavier = new Scanner(System.in);
    		
    		
    
    		do {
    			System.out.println("entrer un montant : ");
    
    			x = clavier.nextDouble();
    
    			if (x > 200)
    				x = 0.95 * x;
    			System.out.printf("le prix avec remise est %.2f euros ", x);
    
    			System.out.println();
    			System.out.print("voulez vous entrer un nouveau montant: O/N?");
    			
    			choix = clavier.nextLine().charAt(0);
    	
    	        
      
    		} while (choix == 'O');
    		
    		clavier.close();
    
    	}
    
    }
    

    ça m'affiche :

    entrer un montant : 
    500
    le prix avec remise est 475,00 euros
    voulez vous entrer un nouveau montant: O/N?Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
    at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
    at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
    at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
    at java.base/java.lang.String.checkIndex(String.java:4570)
    at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:46)
    at java.base/java.lang.String.charAt(String.java:1527)
    at boucles.fairedowhile.main(fairedowhile.java:29)

    Je n'ai pas de message d'erreur sur eclipse.

    Je vous remercie par avance pour vos réponses.


    -
    Edité par ST95 2 novembre 2022 à 15:01:53

    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2022 à 9:30:23

      Bonjour,

      Je pense que c'est une erreur de syntaxe ligne 24 pour afficher un DOUBLE dans le printf.

      System.out.printf("le prix avec remise est %,.2f euros ", x);

      Source

      -
      Edité par M4jestic 2 novembre 2022 à 9:31:06

      • Partager sur Facebook
      • Partager sur Twitter
      Don't quit, suffer now and live the rest of your life as a Champion
        2 novembre 2022 à 15:02:20

        entrer un montant : 
        500
        le prix avec remise est 475,00 euros 
        voulez vous entrer un nouveau montant: O/N?Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        	at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
        	at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
        	at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
        	at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
        	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
        	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
        	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
        	at java.base/java.lang.String.checkIndex(String.java:4570)
        	at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:46)
        	at java.base/java.lang.String.charAt(String.java:1527)
        	at boucles.fairedowhile.main(fairedowhile.java:29)


        M4jestic a écrit:

        Bonjour,

        Je pense que c'est une erreur de syntaxe ligne 24 pour afficher un DOUBLE dans le printf.

        System.out.printf("le prix avec remise est %,.2f euros ", x);

        Source

        -
        Edité par M4jestic il y a environ 5 heures


        bonjour M4jestic, je te remercie, en effet j'avais oublié le f .

        Mais maintenant ça m'affiche une erreur en ligne 29 avec la déclaration du char.

        Aurais tu une idée de correction stp?

        Merci.

        -
        Edité par ST95 2 novembre 2022 à 15:05:56

        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2022 à 15:19:25

          Je pense qu'il faut changer ta condition de boucle DO-WHILE.

          Avec:

          while (choix == 'O');

          Tu vas venir lire chaque nouvelle saisie au clavier avec l'instruction:

          clavier.nextDouble();

          Or, si tu n'as qu'une seule saisie au clavier, ça ne va fonctionner qu'à la première itération. Quand il va effectué une seconde itération, il n'y aura pas de valeur suivante à lire.

          En changeant la condition de ta boucle par:

          while (clavier.hasNext())

          Ce qui correspond à "tant qu'il y a des valeurs saisies au clavier à lire" et te permet de protéger le Scanner des valeurs nulles.

          De plus, avant de venir lire une valeur au clavier, il faut s'assurer que la valeur existe. D'où ma condition ligne 24.

          Voici un fiddle avec ton code et la modification ci-dessus.

          -
          Edité par M4jestic 2 novembre 2022 à 15:30:40

          • Partager sur Facebook
          • Partager sur Twitter
          Don't quit, suffer now and live the rest of your life as a Champion
            2 novembre 2022 à 16:51:08

            Je te remercie beaucoup pour tes explications et ton aide 👍
            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2022 à 16:29:57

              En fait, le problème c'est que nextDouble()  (comme les autres types de next) ne consomme par le séparateur de ligne ;

              Le nextLine() lui renvoie jusqu'au prochain séparateur de fin de ligne (en le consommant, mais ne le renvoie pas); donc ici il renvoie une chaine vide en consommant la fin de ligne suivant le double lu.

              Un second nextLine() renverrait la chaine voulue. Donc le plus simple, c'est de systématiquement consommer la fin de ligne avec un nextLine()

              L'autre solution, c'est de toujours lire avec nextLine() et de parser dans le type voulu ensuite (x=Double.parseDouble(clavier.nextLine())

              https://www.geeksforgeeks.org/why-is-scanner-skipping-nextline-after-use-of-other-next-functions/ 

              • Partager sur Facebook
              • Partager sur Twitter

              erreur avec char

              × 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