Java - Problema al usar un do while junto a una variable string

 
Vista:

Problema al usar un do while junto a una variable string

Publicado por Esteban (2 intervenciones) el 20/06/2021 10:16:46
//en si la idea seria sencilla pide un producto y este me arrojaría el nombre de este y su precio, luego me pediría si quiero ingresar otro con S continuo y con N termino todo bien con N pero si le pongo S no me arroja la parte de ingresar producto sino que me envía a la parte de quiere ingresar otro producto, le realice un debug y al hacerlo me permitió ingresar otro producto luego del do pero este no lo leyó y me arrojo al desea ingresar otro producto.
Nose si me podrían ayudar viendo el error es en JAVA.


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
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication73;
 
import java.util.Scanner;
 
/**
 *
 * @author Hp
 */
public class JavaApplication73 {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner tec= new Scanner (System.in);
        String  producto, b="0,25 $", c="1,00 $";
        String exit;
        do{
           System.out.println("Ingrese nombre del producto");
           producto=tec.nextLine();
           producto=producto.trim();
           if (val_producto(producto)==true) {
               if ((producto.equalsIgnoreCase("Uvas"))||(producto.equalsIgnoreCase("Peras"))) {
                   System.out.printf("Producto: "+producto.toUpperCase()+" \n"
                           +"Precio: %s \n" , b);
               }
               if (producto.equalsIgnoreCase("Sandia")) {
                   System.out.printf("Producto: "+producto.toUpperCase()+"\n"
                   + "Precio: %s \n", c);
               }
           }else{System.out.println("Solo puede ingresar prodcutos de la lista mostrada");}
           System.out.println("Desea inresar otro num? (S/N)");
                do{
                    exit=tec.next().toUpperCase();
                    if (!exit.matches("[NS]"))System.out.println("Solo puede ingresar S ó N");
                }while(!exit.matches("[NS]"));
        }while(!exit.equals("N"));
 
        }
    public static boolean val_producto(String producto){
 
        for (int i = 0; i < producto.length(); i++) {
                if(!Character.isAlphabetic(producto.charAt(i))) return false;
        }
        return true;
    }
 
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al usar un do while junto a una variable string

Publicado por Kabuto (981 intervenciones) el 20/06/2021 14:08:00
Hola.
No uses el método next() para leer por teclado (salvo en casos muy concretos), suele dar problemas como el que te ocurre.
Señalo en negrita:
1
2
3
4
5
6
System.out.println("Desea inresar otro num? (S/N)");
        do{
            exit=tec.next().toUpperCase();
            if (!exit.matches("[NS]")) System.out.println("Solo puede ingresar S ó N");
        }while(!exit.matches("[NS]"));
    }while(!exit.equals("N"));

Usa nextLine()

1
2
3
4
5
6
System.out.println("Desea inresar otro num? (S/N)");
        do{
            exit=tec.nextLine().toUpperCase();
            if (!exit.matches("[NS]")) System.out.println("Solo puede ingresar S ó N");
        }while(!exit.matches("[NS]"));
    }while(!exit.equals("N"));


El problema consiste en que cuando hacemos una entrada por teclado, al pulsar la tecla ENTER se genera un carácter especial llamado "retorno de carro".

El método next() no recoge este carácter, solo coge lo justo y necesario para generar un valor. Entonces, este carácter especial se queda en el flujo de entrada de datos del sistema. (System.in)

¿Y cuál es el problema?
Que nextLine() recoge este carácter.
Entonces, cuando se repite el bucle y llegamos a esta línea:
1
2
3
do{
        System.out.println("Ingrese nombre del producto");
        producto=tec.nextLine();

Ese nextLine() se encuentra el "retorno de carro" que el next() había dejado olvidado.
Entonces nextLine() actúa como si el usuario hubiera pulsado la tecla ENTER otra vez, aunque lo cierto es que no ha tenido ocasión de pulsar nada.

Por eso mejor usar nextLine(), que siempre recoge todo, incluido este carácter especial, y de este modo no se entorpece las siguientes lecturas de teclado.

Este mismo problema te puede ocurrir en programas donde hagas lecturas de números con nextInt(), nextDouble(), etc...
Ellos tampoco recogen el carácter especial, entonces si en ese mismo programa luego intentas hacer una lectura con nextLine(), fallará.

Para evitarlo, lo mejor es leer los números con nextLine() y parsearlos al tipo que corresponda.
Ejemplos;
1
2
int entero = Integer.parseInt(tec.nextLine());
double real= Double.parseDouble(tec.nextLine());
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al usar un do while junto a una variable string

Publicado por Esteban (2 intervenciones) el 20/06/2021 17:23:03
Si ya le cambie eso y funciona muchisimas gracias :3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar