Java 我不知道';我不知道如何离开这个循环结构

Java 我不知道';我不知道如何离开这个循环结构,java,bluej,Java,Bluej,好的,下面的代码循环得很好。它可以循环任意时间。但问题是,我永远无法摆脱这个循环。顺便说一句,我正在尝试建立一个文本冒险,但是我真的需要摆脱这个循环 System.out.println("\n\nWelcome, " + name + "! To proceed, enter your class of fighter."); System.out.println(); boolean x = true; while (x){ //informa

好的,下面的代码循环得很好。它可以循环任意时间。但问题是,我永远无法摆脱这个循环。顺便说一句,我正在尝试建立一个文本冒险,但是我真的需要摆脱这个循环

    System.out.println("\n\nWelcome, " + name + "! To proceed, enter your class of fighter.");
    System.out.println();
    boolean x = true;
    while (x){
        //information print statements

        System.out.println("What will your class be?  ");
        String heroclass = scan.nextLine();
        heroclass.toLowerCase();
        String A;
        switch (heroclass)
        {
            case "slayer": A = "You have selected the Slayer class.";
            break;
            case "blader": A = "You have selected the Blader class.";
            break;
            case "bandit": A = "You have selected the Bandit class.";
            break;
            case "wizard": A = "You have selected the Wizard class.";
            break;
            default: A = "Invalid entry.";
            break;
        }
        String killloop = A;
        if (killloop.charAt(0) == 'Y'){
            x = false;
        }
    }

您需要分配
heroclass.toLowerCase()设置为类的原始值

heroclass = heroclass.toLowerCase();

如果不执行此操作,则不会保存heroclass的小写版本。

将循环放入标记的块中:

myblock: {
    while (true) {
        //code
        heroclass = heroclass.toLowerCase();
        switch(heroclass)
        {
            case "slayer": A = "text";
                break myblock;

            //repeat with other cases
        }
    }
}
//goes to here when you say "break myblock;"
您所做的基本上是将标签
myblock
分配给整个循环。当你说
break myblock
时,它会打断括号内的整个部分

注意:我建议使用此解决方案,因为它不依赖于
开关指定的魔法值;不管它是什么,它都能工作


此外,我还添加了该部分,使其不区分大小写。抱歉搞混了

类是字符串类型。字符串是不可变的对象类型,因此无法更新此字符串。heroclass.toLowerCase()只返回另一个大小写字符较低的字符串对象,因此需要将此字符串结果重新分配给此变量:

heroclass = heroclass.toLowerCase();

虽然编码袋熊是正确的,但我不是你在这里做事的方式的忠实粉丝。像这样对整个程序进行循环不是好的做法。它非常笨重,会导致很多问题,更不用说你让事情变得更复杂了。理想情况下,您希望将程序的这个类选择部分放在一个方法中。然后,如果用户的输入无效,只需递归调用该方法,直到获得正确的输入

案例A:这样做

案例B:这样做

案例C:System.out.println(“不是有效的输入”);类选择器()

此外,当你使用面向对象编程时,你可以将玩家的所有属性存储在一个对象中,并生成处理这些属性的方法。这将使你的代码更清晰,更容易使用


Player1.heal(10);

您尝试了哪些输入?我使用了“杀手”、“布雷德”、“匪徒”和“巫师”试图从中得到一个好的答案。然后我尝试了“Fir-Tree”来获得错误的响应,但它只是不断循环。我想,你会不止一次地要求用户输入。也许你应该把循环/验证逻辑拉到一个方法中。谢谢,这很有意义。如果您再次出现错误,请尝试在代码中的不同点检查不同变量的值。通过这种方式,您可以看到heroclass的值并没有真正变为小写。如果这解决了你的问题,请接受答案并跟进我的建议。我会的,谢谢。这是一个我会尽力记住的技巧。这不是根本问题,请参阅编码袋熊的答案。我知道,但我认为他/她根本不应该使用字符串验证;它只是引入了一个不必要的魔法值。这不是问题的解决方案,这无法修复任何问题。此外,我的解决方案并不依赖于“神奇”值,而是依赖于简单的赋值logic@ostrichofevil您的答案在原始代码的基础上有所改进,但仍然会被破坏原始代码的相同问题打断。除此之外,您的答案仍然提供了一种非理想的方法(相反,类似于
if classList.contains(inputClass)break;
语句的方法会更好)。是的,我必须同意您的观点,这段代码在@ostrichofevil上要干净得多,但如果用户输入像“Slayer”这样的值,它将无法自Slayer起工作!=杀手。如果您在switch语句中用heroclass.toLowerCase()替换heroclass,这将解决实际问题。虽然我同意您的一些观点,但这并不能回答提问者的问题,应该是对我的答案或他的问题的评论,而不是答案本身。