开关中的中断标签
Break label in switch
已编辑:
谢谢大家的帮助。我能够使用我在前几章中学到的技能和你的建议来让它工作。非常感谢!
我决定尝试通过创建一个简单的文字冒险来巩固我从 Java 中学到的东西:初学者指南。我即将开始涉及 classes 和方法的第 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;
}
}
}
}
开关中默认语句的目的是将代码流带回 class 选择。我没有收到编译错误或 运行 时间错误。当您 select 除了 1、2、3 或 4 之外的任何内容时。它会说“不是有效的选择,请输入数字 1-4”,就像它假设的那样,但程序结束了。
我不能在开关中使用这样的标签吗?还是它不起作用,因为它在技术上位于代码块之外?
我相信您在问题中所描述的是某种 goto 功能,而不是 Java 中标签的工作方式。
Java 不幸的是 支持标签。 this article from Oracle.
中对此进行了描述
所以,基本上你可以有带标签的循环,你可以使用关键字 continue
、break
等等来控制循环的流程。
以下示例说明了如何使用带有 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;
外循环将继续。
作为per this SO-question你也可以这样构造:
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();
所以,如果您 break
到 switch
中的标签,基本上会发生什么,您将破坏整个语句(而不是跳转到语句的开头)。
您可以通过 运行 下面的程序进一步测试标签。如果您输入 "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
这样不必要的异常,因为它不会被您的代码抛出。
已编辑: 谢谢大家的帮助。我能够使用我在前几章中学到的技能和你的建议来让它工作。非常感谢!
我决定尝试通过创建一个简单的文字冒险来巩固我从 Java 中学到的东西:初学者指南。我即将开始涉及 classes 和方法的第 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;
}
}
}
}
开关中默认语句的目的是将代码流带回 class 选择。我没有收到编译错误或 运行 时间错误。当您 select 除了 1、2、3 或 4 之外的任何内容时。它会说“不是有效的选择,请输入数字 1-4”,就像它假设的那样,但程序结束了。
我不能在开关中使用这样的标签吗?还是它不起作用,因为它在技术上位于代码块之外?
我相信您在问题中所描述的是某种 goto 功能,而不是 Java 中标签的工作方式。
Java 不幸的是 支持标签。 this article from Oracle.
中对此进行了描述所以,基本上你可以有带标签的循环,你可以使用关键字 continue
、break
等等来控制循环的流程。
以下示例说明了如何使用带有 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;
外循环将继续。
作为per this SO-question你也可以这样构造:
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();
所以,如果您 break
到 switch
中的标签,基本上会发生什么,您将破坏整个语句(而不是跳转到语句的开头)。
您可以通过 运行 下面的程序进一步测试标签。如果您输入 "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
这样不必要的异常,因为它不会被您的代码抛出。