Java Do While语句与两个条件

4

我正在尝试学习Java,但我卡在了一个涉及两个条件的Do While语句的单个程序上。具体来说,我想要一个方法一直运行,直到用户输入"yes"或"no"。下面是我的代码,请问有什么问题吗?

    String answerString;
    Scanner user_input = new Scanner(System.in);
    System.out.println("Do you want a cookie? ");

    do{
    answerString = user_input.next();
    if(answerString.equalsIgnoreCase("yes")){
        System.out.println("You want a cookie.");
    }else if(answerString.equalsIgnoreCase("no")){
        System.out.println("You don't want a cookie.");
    }else{
        System.out.println("Answer by saying 'yes' or 'no'");
    }while(user_input == 'yes' || user_input == 'no');
    }
}}

@TimBiegeleisen 没错,我同意你的观点。我撤回了它。 - mkobit
我想知道是谁点赞了这个问题... 这是最常见的问题 String#equals(Object);,而且它是重复的。 - Junaid
2个回答

4
我会像Tim的答案一样做。但是如果你想按照你尝试的方式做,你需要解决很多问题:
(1) 在Java中,字符串字面值要用双引号括起来,而不是单引号。
(2) user_input是一个Scanner,你不能比较一个scanner和一个字符串。你只能比较一个String和另一个String。所以你应该在比较中使用answerString,而不是user_input。
(3) 永远不要使用"=="来比较字符串。StackOverflow上有953,235个Java问题,其中大约826,102个涉及到有人试图使用"=="来比较字符串。(好吧,有点夸张)使用equals方法:string1.equals(string2)。
(4) 当你写一个do-while循环时,语法是do,然后是{,然后是循环中的代码,然后是},然后是while(条件);。看起来你把最后一个}放错了地方。在while之前的}属于else,所以不算;你需要在while之前再加一个},而不是在它之后。
(5) 我觉得你想写一个循环,如果输入不是"yes"或"no",就继续执行。相反,你做了相反的事情:你写了一个循环,只要输入是"yes"或"no",就会继续执行。你的while条件应该是这样的。
while (!(answerString.equals("yes") || answerString.equals("no")));

[实际上,应该使用equalsIgnoreCase以保持代码的一致性。]!在这里是表示“不”的意思,注意我必须在!之后把整个表达式放在括号中,否则!只会适用于表达式的第一部分。如果你想写一个循环来执行“循环直到某某某”,你必须写成“当某某某不成立时循环”。


2
我总是欣赏有教育意义的回答。 :) 一个缺失的最佳实践:当比较文字和变量时,将文字放在前面("yes".equalsIgnoreCase(answer)),这样可以避免在变量为空时出现异常。即使你知道它不是空的,这么做也很好,因为:a-它强化了当你不知道时的习惯,所以你不会在细节上浪费无用的思考;b-你永远不知道代码会如何发展。 - Chop
通常我会先放字面量,但对于刚学习Java的人来说,一篇文章里有五个课程已经足够了。实际上,我对“无用的思考”这部分提出了质疑。你应该知道你的变量是否可能为空。如果是方法参数,参数是否允许为null应该是方法和其调用者之间合同的一部分。一些语言(如Swift)通过使用不同的语法强制你思考一个值是否可以为空(未定义),我认为这是一件好事。 - ajb
无用的想法:是的,我同意。但并不是所有开发人员都知道、思考或关心它(我已经厌倦了与那些复制粘贴而没有考虑自己上下文中的后果或在从应用程序其他地方复制代码时造成的无用重复的开发人员一起工作)。不考虑此类问题可能会带来麻烦后果,特别是在向客户提供API时。这就是为什么我养成了一个系统性建议的习惯,使它成为一种不需要任何思考的反射。 - Chop

2

我可能会选择使用do循环,该循环将继续接收命令行用户输入,直到他输入“yes”或“no”答案,此时循环中断。

do {
    answerString = user_input.next();

    if ("yes".equalsIgnoreCase(answerString)) {
        System.out.println("You want a cookie.");
        break;
    } else if ("no".equalsIgnoreCase(answerString)) {
        System.out.println("You don't want a cookie.");
        break;
    } else {
        System.out.println("Answer by saying 'yes' or 'no'");
    }
} while(true);

如果使用while(true),我们可能会倾向于将do..while更改为传统的while,因为前者经常被描述为“大脑超载”。 - Chop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接