Java - error desconocido

 
Vista:
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

error desconocido

Publicado por javo (5 intervenciones) el 26/05/2019 03:28:35
hola, agradezco ayuda, estoy estudiando

el bloque de las ultima cuatro lineas no funciona como deberia, no permite la entrada de datos.

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
package entradadedatos;
import java.util.Scanner;
public class EntradaDeDatos {
    public static void main(String[] args) {
 
        //ingresar entero
        Scanner elobjeto= new Scanner (System.in);
        int numero;
        System.out.print(" entrar nro:");
        numero= elobjeto.nextInt();
        System.out.println("es: "+numero);
 
        //ingresar un float
        float numero2;
        System.out.print(" entrar nro:");
        numero2= elobjeto.nextFloat();
        System.out.println("es: "+numero2);
 
        //ingresar un double
        double numero3;
        System.out.print(" entrar nro:");
        numero3= elobjeto.nextDouble();
        System.out.println("es: "+numero3);
 
        String cadena;
        System.out.print("ingresar cadena: ");
        cadena = elobjeto.nextLine();
        System.out.println("la cadena fue: "+cadena);
 
 
    }
 
}
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 Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

error desconocido

Publicado por Billy Joel (876 intervenciones) el 26/05/2019 03:51:00
Hay una explicación larga y otra corta...
Te voy a dar la corta

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
public static void main(String[] args) {
    //ingresar entero
    Scanner elobjeto = new Scanner(System.in);
    int numero;
    System.out.print(" entrar nro:");
    numero = elobjeto.nextInt();
    System.out.println("es: " + numero);
 
    //ingresar un float
    float numero2;
    System.out.print(" entrar nro:");
    numero2 = elobjeto.nextFloat();
    System.out.println("es: " + numero2);
 
    //ingresar un double
    double numero3;
    System.out.print(" entrar nro:");
    numero3 = elobjeto.nextDouble();
    System.out.println("es: " + numero3);
 
    elobjeto.nextLine();
    String cadena;
    System.out.print("ingresar cadena: ");
    cadena = elobjeto.nextLine();
    System.out.println("la cadena fue: " + cadena);
}

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

error desconocido

Publicado por javo (5 intervenciones) el 26/05/2019 19:01:47
100000000000000000 gracias
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
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

error desconocido

Publicado por Kabuto (1381 intervenciones) el 26/05/2019 13:56:48
Pues yo para complementar a Billy, te voy a dar la explicación larga

Siempre que en un código quieras leer datos numéricos y también datos String, te vas a encontrar con este problema.
Y el problema se debe a cómo los métodos de la clase Scanner recogen lo que tecleamos al introducir datos.

Cuando tu introduces una edad, por ejemplo 45, pulsas la tecla 4, la tecla 5 y la tecla return/intro para finalizar la entrada.
Resulta que, aunque no lo veamos, la tecla return también tiene su própio carácter representativo.
En C y derivados (como Java) se representa con \r.
Así que al teclear la edad, los datos que has enviado al Scanner son estos caracteres:
45\r

Bien, si lees esos datos con el método nextLine(), te construirá un String que representa una cadena de texto (y no un valor numérico) y lo hará cogiendo esos tres caracteres.

Pero si lo que necesitas es un valor numérico con el que poder hacer computos, entonces lo leerás con el método nextInt(), o nextDouble(), o nextByte(), etc... los cuáles ya no te van a dar una cadena de texto, sino un valor numérico computable.

Estos métodos solo van a coger los caracteres que sirvan para crear el tipo de valor numérico que le estás pidiendo. Si para la edad quieres un entero int, el método nextInt() cogerá el caracter 4 y también el caracter 5.

Pero no cogerá el caracter \r, ni tampoco lo va desechar, se va a quedar ahí en el stream de entrada que la clase Scanner usa para recibir los datos que tecleamos.

Y es ahora cuando viene el problema.
Si tras leer la edad, y quedarse el \r abandonado en el stream, queremos leer un dato String llamando al método nextLine(); , este método se va a encontrar con el caracter \r de cuando habíamos leído la edad.
Y como este caracter representa a la tecla return, entonces nextLine() va a pensar erroneamente que tú ya has pulsado la tecla intro dando por finalizado la entrada de datos actual.
Así que recogerá el \r, creará una cadena de texto "vacía" y el programa seguirá adelante.


Por eso tú te encuentras con que el programa no te pide los datos para ingresar una cadena, en realidad si los pide, pero como se encuentra el \r que no ha querido recoger el nextDouble() anterior, piensa que tú has pulsado de nuevo la tecla return y da por finalizada la entrada de la cadena sin darte tiempo a ver nada.


En fín, esto tiene sus soluciones.

Una, la más sencilla, es la que propone Billy. Tras haber leido datos numéricos, si ahora quieres leer un String, haz primero una invocación al método nextLine(), sin necesidad de asignarlo a una variable ni nada, para que recoja cualquier posible caracter \r y deje el stream "limpio" para poder ahora sí ingresar una cadena sin problemas.


Otra solución, un poquito más dificil, es leer SIEMPRE los datos usando nextLine(). Y si lo que necesitas es un valor numérico, parseamos el String que nos da nextLine() al tipo de dato que necesitemos.

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
package entradadedatos;
import java.util.Scanner;
public class EntradaDeDatos {
public static void main(String[] args) {
 
//ingresar entero
Scanner elobjeto= new Scanner (System.in);
int numero;
System.out.print(" entrar nro:");
numero= Integer.parseInt(elobjeto.nextLine()); //Leemos como String y parseamos int
System.out.println("es: "+numero);
 
//ingresar un float
float numero2;
System.out.print(" entrar nro:");
numero2= Float.parseFloat(elobjeto.nextLine()); //Parseamos a float
System.out.println("es: "+numero2);
 
//ingresar un double
double numero3;
System.out.print(" entrar nro:");
numero3= Double.parseDouble(elobjeto.nextLine()); //Parseamos a double
System.out.println("es: "+numero3);
 
String cadena;
System.out.print("ingresar cadena: ");
cadena = elobjeto.nextLine();
System.out.println("la cadena fue: "+cadena);
 
}
 
}


Esta forma es un poco más difícil (solo un poquito) pero puede ser más adecuada, ya que en un futuro, cuando ya sepas crear interfaces gráficas con ventanitas, formularios y botones....los datos que recibas de estos formularios SIEMPRE los vas a recibir como String, y por tanto SIEMPRE vas a tener que parsearlos.
Así que no está de más ir cogiendo ya práctica.
Además en otros lenguajes como C# es habitual también hacerlo de este modo.

En cualquier caso, ahora mismo estás aprendiendo y simplemente elige la forma que te parezca más cómoda.

Lo importante es que te quede claro en que consiste este problema, el cuál te lo vas a encontrar siempre que leas datos numéricos y cadenas de texto en el mismo programa, y tendrás que usar una de estas soluciones para evitarlo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
6
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

error desconocido

Publicado por javo (5 intervenciones) el 26/05/2019 19:02:10
100000000000000000 gracias
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