Autor Tema: java.lang.NumberFormatException.forInputString(NumberFormatException CU00672B  (Leído 3189 veces)

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Hola, presento posible solución para el ejercicio propuesto CU00672B del tutorial formativo de programación Java, y también una consulta sobre el comportamiento en el desarrollo del programa en la clase 'main'.

Primero los códigos utilizados:

Clase main:
 
Código: [Seleccionar]
public class TestAdivinarNumero {
public static void main (String[] Args) {
GenerarNumeroAleatorioCien tmpNumero = new GenerarNumeroAleatorioCien();
Integer numeroAd = Integer.valueOf(tmpNumero.getAleatorio());
System.out.println("Muestro el numero generado: " +numeroAd); //Solo con fin didáctico
System.out.println("Se ha generado un numero aleatorio entre 1 y 100. \nUsted intentara  adivinarlo.");
System.out.print("Juguemos a adivinar un número...\n\n");
System.out.println("Ingrese un numero entre 1 y 100: ");
EntradaPorTeclado nuevoNumero = new EntradaPorTeclado();
nuevoNumero.pedirEntrada();
Integer tmpPrueba = Integer.valueOf(nuevoNumero.getEntrada());



while (numeroAd != tmpPrueba) {
if (numeroAd < tmpPrueba) {
System.out.println("El numero ingresado es mayor que el oculto.\nVuelva a intentarlo ingresando uno menor.");
} else if (numeroAd > tmpPrueba) {
System.out.println("El numero ingresado es menor que el oculto.\nVuelva a intentarlo ingresando uno mayor.");
}
nuevoNumero.pedirEntrada();
tmpPrueba = Integer.valueOf(nuevoNumero.getEntrada());
}
System.out.println("El numero ingresado es igual al oculto");
System.out.println("Fin del programa.");
}
}


Clase para generar número aleatorio:

Código: [Seleccionar]
import java.util.Random;
/**
 *
 */
public class GenerarNumeroAleatorioCien {
private int numero;
private Random aleatorio = new Random();

public GenerarNumeroAleatorioCien() {
numero = aleatorio.nextInt((100)+1);
}

public int getAleatorio() {
return numero;
}
}

Clase EntradaPor Teclado

Código: [Seleccionar]
import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author (Arnaldo Martinez)
 * @version (01_2016)
 */
public class EntradaPorTeclado{
   
    private String entradaTcl; //Campo de la clase
    //Constructor
    public EntradaPorTeclado(){
        entradaTcl= "";
        pedirEntrada(); //Llamado a un mètodo interno
    }
    //Mètodos de la clase
    public void pedirEntrada(){
        Scanner eEsc= new Scanner(System.in);
        entradaTcl= eEsc.nextLine();
    }
   
    public String getEntrada(){
        return entradaTcl;
    }
}

La consulta: Al realizar el llamado a main desde consola BlueJ el programa comienza a desarrollarse bien y se detiene luego de la invitación a ingresar el número a buscar, donde para continuar debo pulsar 'enter' una vez. Luego de esto cumple con lo esperado. No logro ver donde está o cual es la causa de la interrupción por lo que solicito una guía sobre este particular.

Muchas gracias por la atención que puedan brindarme y mis disculpas por la extensión.
« Última modificación: 16 de Agosto 2017, 18:26 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola PatAs, tiene cierta importancia poner nombres adecuados a las clases, y el nombre GenerarNumeroAleatorioCien no es un nombre adecuado. En este hilo puedes orientarte sobre esto: https://www.aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698

Trabajar con un String para después convertirlo a numérico como haces con Integer.valueOf(...); puede no ser lo más adecuado. Es decir, puedes trabajar directamente con valores numéricos, que para este ejercicio parece más adecuado.

A mí me ha saltado un error. Primero he introducido un número, luego he tenido que pulsar enter y luego me ha saltado este error:

Código: [Seleccionar]
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.valueOf(Integer.java:766)
at TestAdivinarNumero.main(TestAdivinarNumero.java:11)


El error se debe a que no puede transformar un enter o retorno de carro en un valor numérico.

El problema pareces tenerlo en que el constructor de la clase EntradaPorTeclado contiene esto:

Código: [Seleccionar]
    public EntradaPorTeclado(){
        entradaTcl= "";
        pedirEntrada(); //Llamado a un mètodo interno
    }

Si te fijas en el constructor estás invocando el método pedirEntrada.

En el main tienes esto:

Código: [Seleccionar]
EntradaPorTeclado nuevoNumero = new EntradaPorTeclado();
nuevoNumero.pedirEntrada();

Se genera una llamada por la invocación en el constructor, y otra por la llamada que haces desde el main, de ahí que después de introducir un número (llamada del constructor), te vuelva a pedir otra entrada (llamada desde el main).

Esto deberías corregirlo. Puedes consultar otras soluciones en los foros para orientarte.

Saludos

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Hola Alex.
Había notado cada vez que usé la clase auxiliar 'EntradaPorTeclado' el problema de tener que dar un enter para que el programa arranque. Hasta ahora no supe donde buscar, y el porque se estaba produciendo esto.
Agradezco las correcciones sugeridas, me pongo en campaña para hacer las correcciones y seguir con el aprendizaje.
Saludos

PatAs

  • Sin experiencia
  • *
  • Mensajes: 19
  • ¿Libre...? - Solo cuando pienso y aprendo!!
    • Ver Perfil
Correcciones realizadas, se mejoraron las 3 clases que intervienen en este programa. Todavía no puedo depurar las conversiones de String a Integer. - Saludos
Los códigos:
Código: [Seleccionar]
package CU00672B;
import Entradas.EntradaPorTeclado;

/**
 * Write a description of class TestAdivinarNumero here.
 *
 * @author (Arnaldo R. Martinez)
 * @version (a version number or a date)
 */
public class TestAdivinarNumero {
public static void main (String[] Args) {
EntradaPorTeclado nuevoNumero = new EntradaPorTeclado();
GeneraPseudoAleatorio tmpNumero = new GeneraPseudoAleatorio(100);
System.out.println("Muestro el numero generado: " +tmpNumero.getAleatorio()); //Solo con fin didáctico
System.out.println("Se ha generado un numero aleatorio entre 1 y 100. \nUsted intentara  adivinarlo.");
System.out.print("Juguemos a adivinar un número...\n\n");
System.out.println("Ingrese un numero entre 1 y 100: ");
nuevoNumero.setEntrada();
int num = Integer.valueOf(nuevoNumero.getEntrada());
int ale = tmpNumero.getAleatorio();

do {
if (num > ale) {
System.out.println("El numero ingresado es mayor que el oculto.\nVuelva a intentarlo ingresando uno menor.");
} else if (num < ale) {
System.out.println("El numero ingresado es menor que el oculto.\nVuelva a intentarlo ingresando uno mayor.");
}
nuevoNumero.setEntrada();
num = Integer.valueOf(nuevoNumero.getEntrada());

}while (num != ale);

System.out.println("El numero ingresado es igual al oculto");
System.out.println("Fin del programa.");
}
}
Código: [Seleccionar]
package CU00672B;
import java.util.Random;

/**
 * Write a description of class GeneraPseudoAleatorio here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class GeneraPseudoAleatorio{
private int numero, indiceAleatorio;
private Random aleatorio = new Random();

public GeneraPseudoAleatorio(int indiceAleatorio) {
numero = aleatorio.nextInt((indiceAleatorio)+1);
}

public void setAleatorio(int i) {
i = indiceAleatorio;
}

public int getAleatorio() {
return numero;
}
}
Código: [Seleccionar]
package Entradas;
import java.util.Scanner;
/**
 * Para obtener entradas por teclado
 *
 * @author () Foro de aprenderaprogramar.com
 * @version (01_2016) -
 * Corregido (16-Ago-2017) por feedback desde aprenderaprogramar.com
 */
public class EntradaPorTeclado{
     //Campos de la clase
    private String entrada;
private Scanner entradaTcl;
    //Constructor
    public EntradaPorTeclado(){
        entrada= "";
        entradaTcl = new Scanner(System.in);
    }
   
public void setEntrada() {
entrada = entradaTcl.nextLine();
}

    public String getEntrada(){
        return entrada;
    }
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".