2013-03-10 67 views
4

我不斷收到上面的錯誤消息與下面的IF語句。任何幫助表示讚賞。運算符||是未定義的參數類型(s)布爾,字符串

public void sendMessage(View button) { 
     String mName = Name.getText().toString(); 
     String mGuess = Guess.getText().toString(); 
     if (mGuess != "1" || "2" || "3" || "4" || "5" || "6" || "7" || "8" || "9" || "10") { 
      Toast.makeText(MainActivity.this, 
        "The number you entered was invalid. Please try again.", Toast.LENGTH_LONG).show(); 
     } 

回答

13

首先,您通常不應該使用!=來比較字符串;改爲使用equals()==!=運算符將只測試字符串是否是相同的對象;他們不測試相同的值。其次,你需要擴大這樣的表達:

if (!mGuess.equals("1") || !mGuess.equals("2") || /* etc */) { . . . 

最後,這個邏輯實際上並沒有任何意義。條件永遠是真實的(mGuess將永遠「不等於」除了其中一個測試字符串以外的所有字符)。你可能想:這樣做將是

if (!mGuess.equals("1") && !mGuess.equals("2") && /* etc */) { . . . 

一個更簡潔的方式:

List<String> validStrings = Arrays.asList("1", "2", ...); 
if (!validStrings.contains(mGuess)) { ... 

(你可以聲明validStringsstatic類成員保存創建通過該方法每次一此外,有關如何使用HashSet而不是ArrayList進行查找,請參閱the answer by assylias;它將更快地進行查找。)

PS正如assylias和kcoppock在評論中提到的,您應該考慮將輸入解析爲int值,然後進行數字測試。區別在於解析爲int會將「07」視爲與「7」相同。如果你想允許,那麼這段代碼將做的工作:

boolean ok = false; 
try { 
    int guess = Integer.parseInt(mGuess); 
    ok = guess >= 1 && guess <= 10; 
} catch (NumberFormatException ignored) { 
} 
if (!ok) { . . . 
+2

非常好,徹底的答案。另外,在存在大量字符串的情況下,「HashSet」或類似的可能是更有效的選擇。 – 2013-03-10 01:41:12

+1

@JeremyRoman - 好點。我認爲[@assylias](http://stackoverflow.com/a/15317932/535871)提出了這個建議。 – 2013-03-10 01:42:48

+1

確實。另外,這個數據結構永遠不會改變,而且應該是該類的「靜態final」成員。 – 2013-03-10 01:44:14

2

您需要使用&&來評估你的消極表現,使用.equalsString比較,並在你的if聲明語法正確的表達式:

if (!mGuess.equals("1") && !mGuess.equals("2") && ... 

另見:Java String.equals versus ==

6

你需要讓每個條件明確已經說明。把它寫一個更緊湊的方式是:

Set<String> oneToTen = new HashSet<String> (Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); 

if (!oneToTen.contains(mGuess)) { 

或者,如果你知道mGuess是一個數字,你可以首先將其解析到一個整數的

int guess = Integer.parseInt(mGuess); 
if (guess < 0 || guess > 10) { 
} 
6

原因編譯器錯誤是,表達

mGuess != "1" || "2" || .. 

等效解析以

((mGuess != "1") || "2") || .. 

然而,myGuess != "1"類型是boolean,因此,上述表達式的類型爲

((boolean) || String) || String) || .. 

boolean || String是無效的,因爲每編譯錯誤:

The operator || is undefined for the argument type(s) boolean, String


查看解決方案的其他解答之一。

+4

+1令人驚訝的是,我們其餘的人都沒有想過要解釋錯誤信息本身。值得指出的是'||'沒有爲兩個'String'參數定義。 – 2013-03-10 02:01:23

+0

@TedHopp毫無意義地試圖與你的答案競爭,你得到了該領域釘釘。 – 2013-03-10 02:05:02

+0

現在這是一個答案! – 2013-03-18 10:07:24

相關問題