2015-11-03 60 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