Java - Switch语句无法正常运行,System.out.println神秘地重复

时间:2015-07-14 09:00:43

标签: java

似乎是一个基本问题,但Google和SO都帮助我解决了这个问题。 我用纯粹的无聊制作了一个程序,允许用户输入一串文本,并使用游戏Minecraft的颜色代码编辑所述文本的颜色。我还添加了一个高级功能,允许用户对给定字符串中的每个字母进行着色 - 这就是出现问题的地方。在程序的高级部分结束时,我向用户提示一个菜单,询问他们想要做什么 - 返回程序的主要部分,重新​​启动高级部分,或完全退出程序。选项1和3都按预期工作,但是当您尝试重新启动程序的高级部分时,它会一遍又一遍地重复菜单,直到您选择其他选项。我已经重写了用户的选择如何被多次评估,以及重写了很多其他部分的程序,希望它只是一些逻辑错误,但无济于事。这是他们显示的菜单:

    System.out.println("\n======= DevTest TERMINATED=======\n");
    System.out.println("What would you like to do?");
    System.out.println("1: Return to main program");
    System.out.println("2: Run DevTest again");
    System.out.println("3: Exit program");

    int userOption = input.nextInt();

    switch(userOption){
        case 1:
            System.out.println();
            Start.main(null);
            break;
        case 2:
            DevTests.rainbowTest();
            break;
        case 3: 
            System.exit(0);
        default:
            System.exit(0);
            break;
    }

当用户输入" 2"并按Enter键,程序运行高级程序的第一行(提示用户输入字符串),然后立即再次运行此菜单。我现在已经看了好几个小时了,还没有找到任何解决方案。我在本文末尾添加了整个高级程序,所以你们可以看到所有发生的事情,在你问之前,不,这个程序的主要部分不会干扰这是任何方式。

任何建议/意见都将不胜感激。

注意:我意识到某些代码还没有完成 - 请注意这仍然在进行中,并且在此问题得到解决之前,将会持续相当长的一段时间。 :P

import java.util.Scanner;

public class DevTests {

static Scanner input = new Scanner(System.in);

public static void rainbowTest(){

    System.out.println();
    System.out.println("Enter a string:");
    String userString = input.nextLine();

    int stringLength = userString.length();

    System.out.println();

    String rainbowString = "";

    for(int i = 1; i <= stringLength; i++){
        System.out.println("Enter colour #" + i + ":");
        System.out.println("Black");
        System.out.println("White");
        System.out.println("Blue");
        System.out.println("Dark Blue");
        System.out.println("Green");
        System.out.println("Dark Green");
        System.out.println("Aqua");
        System.out.println("Dark Aqua");
        System.out.println("Red");
        System.out.println("Dark Red");
        System.out.println("Purple");
        System.out.println("Dark Purple");
        System.out.println("Gray");
        System.out.println("Dark Gray");
        System.out.println("Yellow");
        System.out.println("Gold");
        String userColour2 = input.nextLine();
        System.out.println();

        switch (userColour2){
        case "black":
            userColour2 = "§0";
            break;
        case "white":
            userColour2 = "§f";
            break;
        case "blue":
            userColour2 = "§9";
            break;
        case "dark blue":
            userColour2 = "§1";
            break;
        case "green":
            userColour2 = "§a";
            break;
        case "dark green":
            userColour2 = "§2";
            break;
        case "aqua":
            userColour2 = "§b";
            break;
        case "dark aqua":
            userColour2 = "§3";
            break;
        case "red":
            userColour2 = "§c";
            break;
        case "dark red":
            userColour2 = "§4";
            break;
        case "purple":
            userColour2 = "§d";
            break;
        case "dark purple":
            userColour2 = "§5";
            break;
        case "gray":
            userColour2 = "§7";
            break;
        case "dark gray":
            userColour2 = "§8";
            break;
        case "yellow":
            userColour2 = "§e";
            break;
        case "gold":
            userColour2 = "§6";
            break;
        default:
            System.out.println("Please select a colour. \n");
            break;
        }

        rainbowString += userColour2 + userString.charAt(i - 1);
    }

    System.out.println(rainbowString);

    System.out.println("\n======= DevTest TERMINATED=======\n");
    System.out.println("What would you like to do?");
    System.out.println("1: Return to main program");
    System.out.println("2: Run DevTest again");
    System.out.println("3: Exit program");

    int userOption = input.nextInt();

    switch(userOption){
        case 1:
            System.out.println();
            Start.main(null);
            break;
        case 2:
            DevTests.rainbowTest();
            break;
        case 3: 
            System.exit(0);
        default:
            System.exit(0);
            break;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

当您使用int userOption = input.nextInt()时,它实际上不会读取行尾符号,因此它会被下一个String userString = input.nextLine()调用读取。因此,您将获得空userString,因此您跳过for循环并再次转到最后一个菜单。要解决此问题:

int userOption = input.nextInt();
input.nextLine();

答案 1 :(得分:0)

你正在调用函数rainbowTest()递归 在用户输入2的情况下。

在调用函数rainbowTest()之后 正在打印meu;)