在交换机中打破标签

kil*_*615 4 java break switch-statement java-8

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

我决定尝试通过创建简单的文本冒险来巩固我从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;

        }

}

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

was*_*ren 12

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

不幸的是, Java 支持标签.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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

所以,基本上如果你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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我改变了这一点,以阅读更接近"几乎从不推荐使用标签"的东西,因为很少有时候它们是最干净的解决方案,例如,嵌套循环将功能分解为方法会使事情更难以推理.这是相对罕见的,但它们有时会处理. (3认同)
  • @DaveNewton,好点.我已经软化了一点 - thx! (3认同)