tengo un bucle infinito conmigo, HELP!

Iniciado por sowi12, 27 Agosto 2015, 16:16 PM

0 Miembros y 1 Visitante están viendo este tema.

sowi12

Hola!!! Ya se que será alguna chorrada el fallo pero no hago más que tener un bucle:

Introduzca números no letras!
Introduzca una edad:
Introduzca números no letras!
Introduzca una edad:
Introduzca números no letras!
Introduzca una edad:
..... Así hasta el fin de los tiempos.

El código es este:

Código (java) [Seleccionar]
public static int pideInt(String texto) {
       Scanner teclado = new Scanner(System.in);
       boolean correct = false;
       int n = 0;
       do {
           try {
               System.out.println(texto);
               n = teclado.nextInt();
               correct = true;
           } catch (InputMismatchException e) {
               System.out.println("Introduzca números no letras!");
           }
       } while (correct == false);
       return n;
   }


Y se pide desde este constructor:
Código (java) [Seleccionar]
public Empleado() {
       nombre = Pantalla.pideCadena("Introduzca un nombre: ");
       edad = Pantalla.pideInt("Introduzca una edad: ");
       sueldo = Pantalla.pideFloat("Introduzca un sueldo: ");
   }

(las variables están declaradas tranquilos)

La cuestión es que tiene que pedir la edad, y si introduces una letra que te salte el
error y que posteriormente te vuelva a pedir que escribas la edad.

Tengo ejercicios con el mismo constructor y no tengo bucles infinitos, ha
sido añadir la excepción e irse todo al garete  :-\ :-\

Si no estáis muy ocupados...  :xD :xD

Gracias por adelantado  ;D

EndlessLoop

No estoy seguro, pero creo que el while esta causando eso, porque veo que el boolean correct es true todo el tiempo.
Visita mi blog de tecnologia! 0101tecnologia.tk/blog

boolean EndlessLoopMLG = true
if(EndlessLoopMLG ==true){
System.out.Printin("EndlessLoop es MLG")
}

DeMoNcRaZy

Prueba así:

Código (java) [Seleccionar]

public static int pideInt(String texto) {
       Scanner teclado = new Scanner(System.in);
       boolean correct;
       int n = 0;
       do {
           try {
               System.out.println(texto);
               n = teclado.nextInt();
               correct = true;
           } catch (InputMismatchException e) {
               System.out.println("Introduzca números no letras!");
           }
       } while (correct == true);
       return n;
   }

Y se pide desde este constructor:
public Empleado() {
       nombre = Pantalla.pideCadena("Introduzca un nombre: ");
       edad = Pantalla.pideInt("Introduzca una edad: ");
       sueldo = Pantalla.pideFloat("Introduzca un sueldo: ");
   }


No sé si es exactamente lo que busca, esto lo que hace es repetir el bucle se realice o no dicha acción.

De igual modo coméntanos.

Saludos.
Esta página web no está disponible - Google Chrome

sowi12

Siento la tardanza XD,

Si pongo eso me salta el error de que he puesto letras en vez de números pero no repite el pedir la edad, salta directamente a pedir un sueldo.

Y si sólo pongo boolean correct;, me pide que inicialice la variable.

Eleкtro

#4
¿Casi un año registrado en el foro y todavía no formateas apropiadamente los códigos que publicas? ...espero ver una mejora en eso (o el siguiente post podría acabar en la basura). Lee las normas del subforo de programación, por favor.




No estoy muy convencido pero ¿cabría la posibilidad de que el problema tal vez pueda deberse al propio búcle de tipo "do-while"?, más que nada lo comento por que la expresión se evalua al final del bloque y no al principio cómo hace un "while" corriente, y en mi opinión algo grave parece suceder con ese tipo de mecanismo del do-while para que se genere una extraña iteración infinita que parece imperceptible a simple vista, ya que todo parece estar bien en tu código y en el de @YuseTist ...al menos para mi. Quien tenga mejor conocimiento de los internals de Java que me corrija, ya que no estoy seguro de si puede ser eso el fallo.

Aparte de la modificación del tipo de búcle while, he mejorado la lógica del algoritmo y el control de errorres, se obtiene la linea de entrada por parte del usuario y seguidamente parseo el string obtenido utilizando el método apropiado para ello, Integer.parseInt.

De este modo todo parece funcionar cómo es debido:

Código (java) [Seleccionar]
import java.util.InputMismatchException;
import java.util.Scanner;

class HelloWorld{

   public static void main(String []args){
       HelloWorld.inputInt("Input an Integer value: ");
   }
   
   public static int inputInt(String message) {
       
       Scanner scan = new Scanner(System.in);
       int n = 0;
     
       while (n == 0){

           System.out.println(message);

           try {
               n = Integer.parseInt(scan.nextLine());
               
           } catch(NumberFormatException ex){
               System.out.println("Its not a valid Integer value.");
               
           } finally {
               // ...
           }

       }

       scan.close();
       return n;
   }
   
}


El código lo desarrollé y lo testeé de manera online:
http://www.tutorialspoint.com/compile_java_online.php

De todas formas también te digo que eso que haces de definir 3 métodos diferentes para llevar a cabo practicamente la misma tarea (pedir un string y comprobar si es un string, un int, o un float) es un desprovecho de las características y ventajas que te ofrece el lenguaje que estás utilizando, lo que podrías hacer es un método genérico y según el data-type que le pases a la función manejas ese mismo type (o lo devuelves en una función), al principio tu método diempre debe obtener un string del user-input claro está pero puedes especificar un type-parameter en la firma del método genérico y castear/parsear el string obtenido a ese type o devolver ese type, teniendo solamente un método definido en lugar de 3.
Lee sobre Generics en Java, debe ser algo fácil.

PD: No manejo Java en absoluto, solo para defenderme en cosas básicas cómo esta, no puedo proporcionarte mejor ayuda.

Saludos








sowi12

#5
Lo del formateo me lo dices a mí?? :huh: :huh:

Si tu ejemplo está muy bien, pero tal y como me han enseñado a mí (que o lo hago como piden los profesores que tengo o ni me lo miran), tu ejemplo no encajan "con sus enseñanzas" por lo que se ve.

Y ya te digo que soy una "recién nacida en esto" así no esperen que descubran el santo grial conmigo.

Acepto sugerencias para así saber más cosas, pero si me pueden ayudar a solucionarlo dentro de lo que cabe este código (O lo que sea esto XDD), os lo agradecería muchísimo.

Lo gordo es que un día lo hice así y me salio a la primera (Como este no sería porque este va mal XDD).

Eleкtro

Cita de: sowi12 en 14 Septiembre 2015, 12:44 PMSi tu ejemplo está muy bien, pero tal y como me han enseñado a mí (que o lo hago como piden los profesores que tengo o ni me lo miran), tu ejemplo no encajan "con sus enseñanzas" por lo que se ve.

¿En que difiere el ejemplo funcional que te he mostrado, a cómo quieren los profesores que lo resuelvas?, ¿te han mandado expresamente que utilices un do-while, o a que te refieres exactamente?, no somos adivinos.

¿Has probado a usar un do-while en vez de un while en el código que mostré?.

PD: Si, lo del formato de código fue un comentario que iba dirigido a ti, por que es una norma del subforo que se debe cumplir.

Saludos








0roch1

Hay muchísimas formas de resolver el problema, ya comentaron algunas formas pero si no indicas que se tiene que resolver con una estructura especifica o utilizando ciertas palabras reservada nada más nunca ibamos a llegar a lo que querías.

Ahora bien, partiendo de tu código original agrega la línea que indico a continuación.

Código (java) [Seleccionar]

} catch (InputMismatchException e) {
               System.out.println("Introduzca números no letras!");
               teclado.nextLine(); //Consumir Enter
           }



La razón del bucle infinito es que cuando intentas ingresar una entrada y pulsar "Enter" este (Enter) es tomado en cuenta por el scanner al llamar a nextInt. De ahí que cuando ingresas un número no válido se obtiene la excepción y scanner obtiene "Enter" nuevamente porque no ha sido consumido, por lo tanto nunca sale de este bloque.

Espero haberme explicado.

Saludos.