uso switch program example enum ejemplo code java switch-statement java-8 break

java - switch - Romper la etiqueta en el interruptor



switch java ejemplo menu (3)

Editado: Gracias a todos por su ayuda. Pude hacerlo funcionar usando las habilidades que aprendí en los capítulos anteriores y tus consejos. Muchas gracias!

Decidí intentar consolidar las cosas que aprendí de Java: A Beginner''s Guide creando una aventura de texto simple. Estoy a punto de comenzar el Capítulo 4, que involucra clases y métodos. Los primeros tres capítulos se han ocupado de: if, for, while, do-while, switch, interacción simple del teclado y break / continue.

Planeo regresar después de cada capítulo y editarlo para usar las nuevas habilidades que he aprendido. Apenas he arañado la superficie y estoy teniendo un problema.

// A basic, but hopefully, lengthy text adventure. class TextAdventure { public static void main(String args[]) throws java.io.IOException { System.out.println("/t/t BASIC TEXT ADVENTURE"); // variables I need, attributes, classes, character name, player''s choice, gold int str = 0, inte = 0, chr = 0, con = 0, dex = 0, gold; char charName, choice; System.out.println("Welcome player! You are about to embark upon a quest in the form of a text adventure."); System.out.println("You will make choices, fight monsters, and seek treasure. Come back victorious and you"); System.out.println("could quite possibly buy your way into nobility!"); System.out.println(); caseChoice: { System.out.println("Please select your class:"); System.out.println("1. Warrior"); System.out.println("2. Mage"); System.out.println("3. Rogue"); System.out.println("4. Archer"); choice = (char) System.in.read(); // Get players choice of class switch(choice) { case ''1'': System.out.println("You have chosen the Warrior class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 16; inte = 11; chr = 14; con = 15; dex = 9; break; case ''2'': System.out.println("You have chosen the Mage class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 9; inte = 16; chr = 14; con = 15; dex = 11; break; case ''3'': System.out.println("You have chosen the Rogue class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 15; inte = 11; chr = 14; con = 9; dex = 16; break; case ''4'': System.out.println("You have chosen the Archer class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 9; inte = 11; chr = 14; con = 15; dex = 16; break; default: System.out.println("Not a valid choice, please enter a digit 1-4"); break caseChoice; } } } }

La intención de la instrucción predeterminada en el interruptor es devolver el flujo de código a la opción de clase. NO recibo un error de compilación o error de tiempo de ejecución. Cuando selecciona cualquier cosa además de 1, 2, 3 o 4. Dice "No es una opción válida, ingrese un dígito 1-4" como se supone que debe hacer, pero el programa finaliza.

¿No tengo permitido usar una etiqueta como esa en un interruptor? ¿O no funciona porque está técnicamente fuera del bloque de código?


Creo que el uso de la etiqueta combinada con la declaración de break puso en el camino equivocado. Simplemente puede usar la declaración de interrupción en el interruptor y si desea evitar la salida del programa, simplemente use un while . Debajo del código actualizado.

// A basic, but hopefully, lengthy text adventure. import java.util.Scanner; class TextAdventure { public static void main(String args[]) { System.out.println("/t/t BASIC TEXT ADVENTURE"); // variables I need, attributes, classes, character name, player''s choice, gold int str = 0, inte = 0, chr = 0, con = 0, dex = 0, gold; char charName, choice; System.out.println("Welcome player! You are about to embark upon a quest in the form of a text adventure."); System.out.println("You will make choices, fight monsters, and seek treasure. Come back victorious and you"); System.out.println("could quite possibly buy your way into nobility!"); System.out.println(); boolean toEnd = false; while(!toEnd) { { System.out.println("Please select your class:"); System.out.println("1. Warrior"); System.out.println("2. Mage"); System.out.println("3. Rogue"); System.out.println("4. Archer"); Scanner scanner = new Scanner(System.in); choice = scanner.next().charAt(0); // Get players choice of class toEnd = true; switch (choice) { case ''1'': System.out.println("You have chosen the Warrior class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 16; inte = 11; chr = 14; con = 15; dex = 9; break; case ''2'': System.out.println("You have chosen the Mage class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 9; inte = 16; chr = 14; con = 15; dex = 11; break; case ''3'': System.out.println("You have chosen the Rogue class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 15; inte = 11; chr = 14; con = 9; dex = 16; break; case ''4'': System.out.println("You have chosen the Archer class!"); System.out.println("You''re stats are as followed:"); System.out.println("Str: 16"); System.out.println("Int: 11"); System.out.println("Chr: 14"); System.out.println("Con: 15"); System.out.println("Dex: 9"); str = 9; inte = 11; chr = 14; con = 15; dex = 16; break; default: System.out.println("Not a valid choice, please enter a digit 1-4"); toEnd = false; break;// caseChoice; } } } } }

Usar etiqueta en Java está permitido pero no es una buena práctica. Uno más piensa, evite usar excepciones innecesarias como IOException ya que su código no lo arroja.


Creo que lo que está describiendo en su problema es algún tipo de funcionalidad goto y no es así como funcionan las etiquetas en Java.

Desafortunadamente, Java admite etiquetas. Esto se describe en este artículo de Oracle .

Entonces, básicamente, puede tener bucles con etiquetas y puede usar la palabra clave continue , break , etc. para controlar el flujo del bucle.

El siguiente ejemplo ilustra cómo usar el bucle con la palabra clave break . Cuando se invoca break , finaliza la instrucción etiquetada, es decir, la instrucción que sigue a someLabel . NO vuelve a ejecutar donde se especificó la etiqueta.

someLabel: for (i = 0; i < 100; i++) { for (j = 0; j < 100; j++) { if (i % 20 == 0) { break someLabel; } } }

La palabra clave continue maneja las etiquetas de la misma manera. Cuando continue someLabel; por ejemplo, continue someLabel; el bucle externo continuará.

Según esta pregunta SO, también puedes hacer construcciones como esta:

BlockSegment: if (conditionIsTrue) { doSomeProcessing (); if (resultOfProcessingIsFalse()) break BlockSegment; otherwiseDoSomeMoreProcessing(); // These lines get skipped if the break statement // above gets executed } // This is where you resume execution after the break anotherStatement();

Entonces, básicamente, lo que sucede si break una etiqueta en tu switch , romperás esa declaración completa (y no saltarás al principio de la declaración).

Puede probar las etiquetas más adelante ejecutando el programa a continuación. Rompe el ciclo while si ingresa "salir", de lo contrario, simplemente rompe el interruptor.

public static void main(String... args) { programLoop: { while (true) { Scanner scanner = new Scanner(System.in); final String input = scanner.next(); switch (input) { case "quit": break programLoop; // breaks the while-loop default: break; // break the switch } System.out.println("After the switch"); } } }

Personalmente, tomaría un caso muy especial para poder recomendar el uso de etiquetas . Me parece que el código es más fácil de seguir si, en su lugar, reorganiza el código para que las etiquetas no sean necesarias (por ejemplo, divida el código complejo en funciones más pequeñas).


Puede encerrar el código en un ciclo while de la siguiente manera para lograr la tarea:

boolean validChoice=false; while(!validChoice){ switch(choice){ case 1: //logic validChoice=true; case 2: //logic validChoice=true; case 3: //logic validChoice=true; default: //print "invalid choice" and ask to reenter }