4

我通过以下 IF 语句不断收到上述错误消息。任何帮助表示赞赏。

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();
        }
4

4 回答 4

13

首先,您通常不应该使用!=来比较字符串;改为使用equals()==and!=运算符只会测试字符串是否是相同的对象;他们不测试相等的值。其次,您需要像这样扩展表达式:

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类成员,以保存每次通过该方法创建一个。另外,请参阅assylias 的答案,了解如何使用 aHashSet而不是 anArrayList进行查找;它会更快地进行查找。)

PS 正如 assylias 和 kcoppock 在评论中提到的,您应该考虑将输入解析为一个int值,然后进行数值测试。不同之处在于,解析为 anint会将“07”视为与“7”相同。如果您想允许这样做,那么此代码将完成这项工作:

boolean ok = false;
try {
    int guess = Integer.parseInt(mGuess);
    ok = guess >= 1 && guess <= 10;
} catch (NumberFormatException ignored) {
}
if (!ok) { . . .
于 2013-03-10T01:31:17.010 回答
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) {
}
于 2013-03-10T01:31:51.217 回答
6

编译器错误1原因是表达式

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

等效地解析为

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

然而,类型myGuess != "1"boolean,所以上面的表达式被键入为

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

boolean || String无效,根据编译器错误:

运算符 || 未定义参数类型 boolean, String


1请参阅其他答案之一以获取解决方案。

于 2013-03-10T01:56:56.240 回答
2

您需要使用&&来评估否定表达式,.equals用于String比较,并在if语句中使用语法正确的表达式:

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

另请参阅:Java String.equals 与 ==

于 2013-03-10T01:31:40.187 回答