2015-11-03 119 views
4

我想学习java,但我卡住试图做一个单一的程序,其中涉及两个条件的同时声明。具体来说,我想要一个方法运行,直到用户写入“是”或“否”。那么,下面是我的事情,它有什么问题?Java尽管声明有两个条件

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

@TimBiegeleisen是的,我同意你的意见。我收回了它。 – mkobit

+0

我不知道谁提出这个问题......这是最常见的问题'String#equals(Object);'它是重复的 – Junaid

回答

2

我可能会选择一个do循环将继续下去,直到他进入一个“是”或“否”的答案,此时环断裂采取命令行用户输入。

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); 
+0

如果使用'while(true)',我们可能会试图改变do..while到一个传统的时候,因为第一个经常被描述为“大脑过载”。 – Chop

4

我会做一些类似蒂姆的答案的东西。但是按照你试图做的方式来做事,你有很多问题需要修正:

(1)Java中的字符串文字被双引号包围,而不是单引号。 (3)user_inputScanner。您无法将扫描仪与字符串进行比较。您只能将String与另一个String进行比较。所以你应该在你的比较中使用answerString,而不是user_input

(3)千万不要使用==来比较字符串。 StackOverflow有953,235个Java问题,其中大约826,102个涉及某人试图使用==来比较字符串。 (好吧,这有点夸张。)使用equals方法:string1.equals(string2)

(4)当写do-while环,语法是do,随后{,随后在循环中的代码,接着},随后while(condition);。看起来你把最后的}放在了错误的地方。在while之前的}属于else,所以不计算;您需要在while之前的其他},而不是之后。 (5)我认为你正在尝试编写一个循环,如果输入不是yesno。相反,你做了相反的事情:你写了一个循环,只要输入yesno就一直保持。你while条件应该是这个样子

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

[其实,这应该是equalsIgnoreCase要与代码的其余部分是一致的。] !的意思是“不”在这里,请注意,我不得不把整个表达式!之后的圆括号,否则!将仅应用于表达式的第一部分。如果你正在尝试编写一个循环,循环直到等待,那么你必须把它写成“Loop while!(blah-blah-blah)”。

+2

我总是欣赏一个教育的答案。 :)缺少一个最佳实践:比较一个文字和一个变量时,首先放置文字('“是”.equalsIgnoreCase(answer)'),因为这避免了在变量为空的情况下的异常。即使你知道它不是很好,因为:a - 当你不知道的时候强化习惯,所以你不会花费无用的思考细节; b - 你永远不知道代码如何演变。 – Chop

+0

我通常会先把文字放在首位,但是对于刚刚学习Java的人来说,一篇文章中的五节课就足够了。其实我质疑“无用思考”的部分。你应该知道你的变量是否可能为null。如果它是一个方法参数,那么参数是否被允许为“null”应该是方法和它的调用者之间的契约的一部分。像Swift这样的语言强迫你用一种不同的语法来考虑一个值是否可以为null(未定义),我认为这是一件好事。 – ajb

+0

无用的思考:是的,我同意。但并非所有的开发人员都知道,思考或甚至在乎(我厌倦了与复制粘贴而不考虑其自身环境中的后果或当从应用程序中的其他地方复制代码时的无用重复)的开发人员的工作。不考虑它的习惯可能会产生问题,特别是向客户提供API时。这就是为什么我习惯于建议系统地做这件事,使其成为一种不需要任何思考的反射。 – Chop