运算符||是未定义的参数类型(s)布尔,字符串

问题描述:

我不断收到上面的错误消息与下面的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(); 
     } 

首先,您通常不应该使用!=来比较字符串;改为使用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://*.com/a/15317932/535871)提出了这个建议。 – 2013-03-10 01:42:48

+1

确实。另外,这个数据结构永远不会改变,而且应该是该类的“静态final”成员。 – 2013-03-10 01:44:14

您需要使用&&来评估你的消极表现,使用.equalsString比较,并在你的if声明语法正确的表达式:

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

另见:Java String.equals versus ==

你需要让每个条件明确已经说明。把它写一个更紧凑的方式是:

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) { 
} 

原因编译器错误是,表达

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