Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > programa se queda pillado en bucle

Buenos dias!
Estaba realizando este programa pero cuando le das a una de las opciones se queda pillado en el bucle y no se por donde meter el semaforo para que me de otra vez la opcion de ir escogiendo la opcion.
Alguna idea gracias de antemano


/**
*
* @author Oscar
* Programa que mostra per pantalla el seguent menu:
* 1) - Primera Opcio
* 2) - Segona Opcio
* 3) - Tercera Opcio
* 4) - Quarta Opcio
*
* 0) - Sortir
*
* Selecciona una opcio
* Quan l’usuari premi alguna de les opcions el programa mostrarà:
* Has escollit la <primera | segona | tercera | quarta > opció.
* Prem una tecla per continuar.
* Quan l’usuari premi una tecla, el programa tornarà a mostrar de nou el menú.
* No es realitzarà cap altre acció si la tecla premuda no és cap de les opcions del menú.
* L’usuari podrà sortir de l'aplicació prement la opció ‘0’.
*/
public class Ex_02 {
//CONSTANTS


//VARIABLES GLOBALS
private int nombreIntroduit;
private boolean esValorEnter = false;
private boolean finalitzarPrograma = false;
Scanner lector = new Scanner(System.in);


//METODES ASSOCIATS AL PROBLEMA GENERAL

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//Aqui cal usar el nom de la classe que esteu creant
Ex_02 programa = new Ex_02();
programa.inici();
} //tancament metode principal

public void inici() {
/*
* instruccions del metode principal (problema general)
* invocacio dels metodes
*/
mostrarMenu();

} //tancament metode inici()

//METODES ASSOCIATS AL PRIMER NIVELL DE DESCOMPOSICIO
/*
* Metode que resol el subproblema de mostrar menu per pantalla
* Paràm entrada: cap
* Paràm sortida: cap
*/
public void mostrarMenu() {
while (!finalitzarPrograma) {
System.out.println("1) - Primera opció.");
System.out.println("2) - Segona opció. ");
System.out.println("3) - Tercera opció. ");
System.out.println("4) - Quarta opció. ");
System.out.println("");
System.out.println("0) - Sortida programa.");
System.out.println("");
System.out.print("Selecciona una opció: ");
tractarOpcio();
} //tancament bucle while

} //tancament metode mostrarMenu()



//METODES ASSOCIATS AL SEGON NIVELL DE DESCOMPOSICIO

/*
*
*/
public void tractarOpcio() {
// Scanner lector = new Scanner(System.in);
String quinaOpcio=null;
while (!esValorEnter) {
esValorEnter = lector.hasNextInt();
if (esValorEnter) {
nombreIntroduit = lector.nextInt();
switch (nombreIntroduit) {
case 0:
quinaOpcio = "sortir";
break;
case 1:
quinaOpcio = "primera";
break;
case 2:
quinaOpcio = "segona";
break;
case 3:
quinaOpcio = "tercera";
break;
case 4:
quinaOpcio = "quarta";
break;
} //tancament del switch
if (!quinaOpcio.equals("sortir")) {
//!"sortir".equals(quinaOpcio)
System.out.println("Has escollit la " + quinaOpcio + " opció");
continuarTreballant();
} else {
System.out.println("\n!Programa finalitzat!");
finalitzarPrograma = true;
}

} else {
System.out.println("\nAixò no es un valor Numeric\n");
lector.nextLine();
mostrarMenu();
}

} //tancament bucle while

} //tancament metode tractarOpcio()


/*
*
*/
public void continuarTreballant() {
// Scanner lector = new Scanner(System.in);
String tecla = "";
System.out.print("\nPrem la tecla 'Enter' per tornar al menú principal: \n");
String teclaEnter = lector.nextLine();
if (tecla.equals(teclaEnter)) {
mostrarMenu();
finalitzarPrograma = true;
} else {
continuarTreballant();
}
} //tancament metode continuarTreballant()

//METODES ASSOCIATS AL TERCER NIVELL DE DESCOMPOSICIO

}//tancament de la clase

diciembre 25, 2012 | Registered Commenterobv

En estos casos, mejor que "bucear" por el código, es de la máxima utilidad usar un debugger. NetBeans tiene uno incorporado, y supongo que Eclipse lo tendrá también, aunque sospecho que como plugin.

diciembre 26, 2012 | Registered Commenterchoces

Sin necesidad de un debugger (que nunca viene mal cuando hay bugs muy enredados), he ejecutado tu aplicación... y me he mareado al ver la recurrencia cíclica que tienen tus métodos. El "bucle" lo tienes en el propio diseño de la aplicación.

diciembre 26, 2012 | Registered Commenterchoces

gracias por las respuestas.

Si es que soy novato en esto de la programacion y ahora estamos en el tema de la separacion en metodos pero no hay manera de como solucionar esto. Estoy atascado :(

Antes todo lo codificabamos en el main y ahora empezamos a codificar separando todo y realizando las funciones lo "mas sencillas posibles" y a poder ser que sean unicas vamos que hagan lo que dicen..

El tema del debugger no lo acabo de dominar :(

PD: el problema es que si le quito el while del metodo mostrar menu no me deja escojer otra vez
las opciones 1 2 3 4 y sale del programa

En fin!

diciembre 27, 2012 | Registered Commenterobv

Hoy es un poco tarde; pero mañana te plantearé una solución.

diciembre 27, 2012 | Registered Commenterchoces

Una posible solución:


public class EX02 {

private static Scanner scan = new Scanner(System.in);

/**
@param args the command line arguments
*/
public static void main(String[] args) {
process();
}

private static void showMenu() {
System.out.println("1) - Primera opció.");
System.out.println("2) - Segona opció. ");
System.out.println("3) - Tercera opció. ");
System.out.println("4) - Quarta opció. ");
System.out.println("");
System.out.println("0) - Sortida programa.");
System.out.println("");
System.out.print("Selecciona una opció: ");
}

private static int getInput() {
int input = -1;
String linea = scan.nextLine();
try {
input = Integer.parseInt(linea);
} catch (NumberFormatException ex) {
System.out.println("No se ha introducido una opción válida");
}
return input;
}

private static void optionSelected(int option) {
System.out.println("Has escollit la " + option + " opció");
}

private static void process() {
mainloop:
while (true) {
showMenu();
switch (getInput()) {
case 0:
System.out.println("\n!Programa finalitzat!");
break mainloop;
case 1:
optionSelected(1);
break;
case 2:
optionSelected(2);
break;
case 3:
optionSelected(3);
break;
case 4:
optionSelected(4);
break;
}
}
}
}

diciembre 28, 2012 | Registered Commenterchoces

Como verás, no se hace una comprobación exhaustiva de los valores introducidos, excepto que sí se verifica que sean números enteros válidos. Se podría ampliar el método getInput para que realice una validación completa de la entrada, y añadir un default al case para que maneje esas situaciones.

diciembre 28, 2012 | Registered Commenterchoces

Una nueva versión con validación más detallada:

public class EX02 {

private static Scanner scan = new Scanner(System.in);

/**
@param args the command line arguments
*/
public static void main(String[] args) {
process();
}

private static void showMenu() {
System.out.println("1) - Primera opció.");
System.out.println("2) - Segona opció. ");
System.out.println("3) - Tercera opció. ");
System.out.println("4) - Quarta opció. ");
System.out.println("");
System.out.println("0) - Sortida programa.");
System.out.println("");
System.out.print("Selecciona una opció: ");
}

private static int getInput() {
int input = -1;
String linea = scan.nextLine();
try {
input = Integer.parseInt(linea);
} catch (NumberFormatException ex) {
System.out.println("No se ha introducido un número");
}
if (input < 0 || input > 4) {
input = -1;
}
return input;
}

private static void optionSelected(int option) {
System.out.println("Has escollit la " + option + " opció");
}

private static void process() {
mainloop:
while (true) {
showMenu();
switch (getInput()) {
case 0:
System.out.println("\n!Programa finalitzat!");
break mainloop;
case 1:
optionSelected(1);
break;
case 2:
optionSelected(2);
break;
case 3:
optionSelected(3);
break;
case 4:
optionSelected(4);
break;
default:
System.out.println("Opción errónea");
break;
}
}
}
}

diciembre 28, 2012 | Registered Commenterchoces