带有两个条件的Java Do While语句

带有两个条件的Java Do While语句,java,do-while,invalid-characters,Java,Do While,Invalid Characters,我正在尝试学习java,但我一直在尝试编写一个单独的程序,该程序涉及带有两个条件的do While语句。具体地说,我想要一个方法一直运行到用户写“是”或“否”。嗯,下面是我的东西,怎么了 String answerString; Scanner user_input = new Scanner(System.in); System.out.println("Do you want a cookie? "); do{ answerString = user

我正在尝试学习java,但我一直在尝试编写一个单独的程序,该程序涉及带有两个条件的do While语句。具体地说,我想要一个方法一直运行到用户写“是”或“否”。嗯,下面是我的东西,怎么了

    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');
    }
}}

我可能会选择一个
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);

我会做一些类似于蒂姆回答的事情。但要按照你尝试的方式做事,你有很多问题需要解决:

(1) Java中的字符串文本由双引号包围,而不是单引号

(2)
用户输入
是一个
扫描仪
。不能将扫描仪与字符串进行比较。您只能将一个
字符串
与另一个
字符串
进行比较。因此,在比较中应该使用
answerString
,而不是
user\u input

(3) 切勿使用
==
来比较字符串。StackOverflow有953235个Java问题,其中大约826102个涉及试图使用
==
比较字符串的人。(好的,这有点夸张。)使用
equals
方法:
string1.equals(string2)

(4) 编写
do-while
循环时,语法为
do
,后跟
{
,后跟循环中的代码,后跟
}
,后跟
while(条件)。看起来你把最后一个
}
放错地方了。
}
就在
之前,而
属于
的else
,所以这不算数;您需要在
之前的
}
中添加另一个
,而不是在它之后

(5) 我认为您试图编写一个循环,如果输入不是
yes
no
,循环将继续运行。相反,您做了相反的事情:您编写了一个循环,只要输入
,循环就会继续运行。您的
while
状况应该类似

while (!(answerString.equals("yes") || answerString.equals("no")));

[实际上,它应该是
equalsIgnoreCase
以与代码的其余部分保持一致。]
在这里的意思是“not”,请注意,我必须将整个表达式放在
后面的括号中,否则为
将仅应用于表达式的第一部分。如果你想写一个循环,它是“循环直到废话废话”,你必须写成“循环
,而
(废话废话)。

@TimBiegeleisen是的,我同意你的观点。我收回了它。我想知道是谁在这个问题上投了赞成票。。。这是最常见的问题
String#equals(Object)而且它是重复的。我总是很欣赏一个有教育意义的答案。:)缺少一个最佳实践:在比较文本和变量时,将文本放在第一位(
“yes”。equalsIgnoreCase(answer)
),因为这样可以避免变量为null时出现异常。即使你知道它不是好的,也这样做是因为:a-它强化了你不知道时的习惯,这样你就不会在细节上花费无用的思考;你永远不知道代码是如何演变的。我通常会把文字放在第一位,但是一篇文章中的五节课对于刚刚学习Java的人来说已经足够了。事实上,我质疑关于“无用思维”的部分。您应该知道您的变量是否可能为null。如果是方法参数,是否允许参数为
null
应该是方法与其调用方之间的契约的一部分。像Swift这样的一些语言迫使你考虑一个值是否可以通过使用不同的语法为null(未定义),我认为这是一件好事。但并不是所有的开发人员都知道、想一想,甚至不在乎(我越来越厌倦了与那些复制粘贴而不考虑在他们自己的上下文中的后果的开发人员一起工作,或者当他们从应用程序的其他地方复制代码时,不考虑无用的复制)。不考虑it的习惯可能会产生问题,尤其是在向客户机提供API时。这就是为什么我养成了建议系统性地做这件事的习惯,让它成为一种不需要任何思考的反射。如果使用
while(true)
,我们可能会尝试将do..while改为传统的while,因为第一个经常被描述为“大脑过载”。