用户输入和切换声明的奇怪错误

时间:2014-12-27 14:49:38

标签: java switch-statement

public class VoteTUIView {

    VoteMachine voteMachine;

    public VoteTUIView(VoteMachine voteMachine) {
        this.voteMachine = voteMachine;
        this.start();

    }

    public static String errorMissingVariable = "This command needs an variable";
    public static String errorPartyNoneExistant = "This party does not exist";
    public static String errorAddImpossible = "You can't add something to that";
    public static String help = "Seriously? You need help? You look like a smart boy/girl, you can figure this out yourself. I believe in you! ";


    public void start(){
        System.out.println("Please insert a command: (VOTE [party], ADD PARTY [party], VOTES, PARTIES, EXIT, and HELP) ");
        Scanner inputScanner = new Scanner(System.in);
        while(inputScanner.hasNextLine()){
            String inputCommand = inputScanner.next();
            switch (inputCommand){
                case "VOTE": {
                    if(inputScanner.hasNext()){
                        String inputCommand2 = inputScanner.next();
                        if(voteMachine.getParties().getParties().contains(inputCommand2)){
                            voteMachine.vote(inputCommand2);
                        }
                        else{
                            System.out.println(errorPartyNoneExistant);
                        }
                    }
                    else{
                        System.out.println(errorMissingVariable);
                    }
                }
                case "ADD": {
                    if(inputScanner.next().equals("PARTY")) {
                        if(inputScanner.hasNext()) {
                            voteMachine.addParty(inputScanner.next());
                        }
                        else{
                            System.out.println(errorMissingVariable);
                        }
                    }
                    else {
                        showError(errorAddImpossible);
                    }
                }
                case "VOTES": {
                    showVotes(voteMachine.getVotes().getVoteList());
                }
                case "PARTIES": {
                    showParties(voteMachine.getParties().getParties());
                }
                case "EXIT": {
                    break;
                }
                case "HELP": {
                    System.out.println(help);
                }
                default: {
                }
            }

            System.out.println("\nPlease insert a command: (VOTE [party], ADD PARTY [party], VOTES, PARTIES, EXIT, and HELP) ");
        }
    }

    public void showVotes(Map<String, Integer> voteList) {
        int i = 1;
        for(String partyName : voteList.keySet()){
            System.out.println(i+": "+partyName+" has obtained "+voteList.get(partyName)+" votes.");
            i++;
        }
    }

    private void showParties(List<String> partyList) {
        int i = 1;
        for(String partyName : partyList){
            System.out.println(i+": "+partyName);
            i++;
        }
    }

    private void showError(String error) {
        System.out.println("Error: " + error);
    }        
}

我正在与一个奇怪的虫子战斗。程序读取用户输入并确定对交换机采取的操作,但通常情况下,交换机中的多个案例在它们显然不应该被触发时被触发。它让我发疯了。有谁知道它为什么这样做?

Please insert a command: (VOTE [party], ADD PARTY [party], VOTES, PARTIES, EXIT, and HELP)   
ADD PARTY DemoCant's  
1: DemoCant's

Please insert a command: (VOTE [party], ADD PARTY [party], VOTES, PARTIES, EXIT, and HELP)   
ADD PARTY RepublicRats  
1: DemoCant's  
2: RepublicRats

Please insert a command: (VOTE [party], ADD PARTY [party], VOTES, PARTIES, EXIT, and HELP)   
VOTE DemoCant's  
VOTE DemoCant's 
Error: You can't add something to that  
1: DemoCant's has obtained 1 votes.  
1: DemoCant's  
2: RepublicRats

5 个答案:

答案 0 :(得分:3)

您几乎在所有break个案例中都缺少switch个陈述,因此代码只会落到下一个案例中。请参阅docs

中关于秋季的部分
case "VOTE": {
    ....
    break;
} 
.....

答案 1 :(得分:3)

case语句中的switch会失效,并继续执行下一个case。如果您不希望case落空,请添加break;语句和case的结尾。 E.g:

switch (inputCommand){
    case "VOTE":
        // code for voting
        break;
    case "ADD": {
        // code for adding
        break;
    // etc...

答案 2 :(得分:2)

  

我正在与一个奇怪的虫子战斗。

这就是为什么在提问之前你会使用调试器的原因。

  

程序读取用户输入并确定对交换机采取的操作,但通常情况下,交换机中的多个案例在它们显然不应该被触发时被触发。

因为没有break;return;,所以没有理由突破交换机。

注意:Java,C,C ++,C#都是这样做的。

  

这让我很生气。有人知道为什么会这样吗?

因为这是应该做的。

答案 3 :(得分:1)

您缺少break语句。没有break语句,这是一种预期的行为。
您可以在http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

进行更多阅读

答案 4 :(得分:0)

在每个break

之后添加Case语句

如果您没有添加break语句,代码流将进入下一个案例,直到所有案例结束或遇到break

相关问题