在交换机中打破标签

编辑:谢谢大家的帮助。 我能够使用我在前面章节中学到的技巧和你的建议来使用它。 非常感谢!

我决定尝试通过创建简单的文本冒险来巩固我从Java学到的东西:初学者指南。 我即将开始涉及类和方法的第4章。 前三章讨论了if,for,while,do-while,switch,简单的键盘交互以及break / continue。

我计划在每章后回去并编辑它以使用我学到的新技能。 我几乎没有触及表面,我遇到了一个问题。

// 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; } } } } 

切换中的默认语句的目的是将代码流返回到类选择。 我没有收到编译错误或运行时错误。 当您选择除1,2,3或4之外的任何内容时。它表示“不是一个有效的选择,请输入数字1-4”,就像它想象的那样,但程序结束。

我不允许在交换机中使用这样的标签吗? 或者它不起作用,因为它在技术上超出了代码块?

我相信你在你的问题中描述的是某种gotofunction,而不是Java中标签的工作方式。

不幸的是, Java支持标签。 Oracle的这篇文章对此进行了描述。

所以,基本上你可以有带标签的循环,你可以使用关键字continuebreak等来控制循环的流程。

以下示例说明了如何将循环与break关键字一起使用。 当调用break ,它会终止标记语句,即someLabel的语句。 它不会返回执行指定标签的位置。

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

continue关键字以相同的方式处理标签。 当你调用例如continue someLabel; 外循环将继续。

根据这个SO问题,你也可以做这样的结构:

 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(); 

所以,基本上如果你在switch break一个标签会发生什么,你将破坏整个语句(而不是跳转到语句的开头)。

您可以通过运行以下程序进一步测试标签。 如果输入“quit”,它会打破while循环,否则它只会破坏开关。

 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"); } } } 

就个人而言,我需要一个非常特殊的情况才能推荐使用标签 。 我发现,如果您重新安排代码以便不需要标签(例如,将复杂的代码分解为更小的函数),代码就会更容易理解。

您可以按如下方式将代码括在while循环中以实现任务:

 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 } 

我认为使用标签结合break语句会让你走错路。 你可以简单地在开关中使用break语句,如果你想避免程序退出,只需使用一段while 。 在更新的代码下面。

 // 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; } } } } } 

允许在Java中使用标签,但这不是一个好习惯。 还有一个想法,避免使用像IOException这样的不必要的exception,因为你的代码不会抛出它。