运算符||是未定义的参数类型(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)) { ...
(你可以声明validStrings
为static
类成员保存创建通过该方法每次一此外,有关如何使用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) { . . .
您需要使用&&
来评估你的消极表现,使用.equals
为String
比较,并在你的if
声明语法正确的表达式:
if (!mGuess.equals("1") && !mGuess.equals("2") && ...
你需要让每个条件明确已经说明。把它写一个更紧凑的方式是:
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
查看解决方案的其他解答之一。
+1令人惊讶的是,我们其余的人都没有想过要解释错误信息本身。值得指出的是'||'没有为两个'String'参数定义。 – 2013-03-10 02:01:23
@TedHopp毫无意义地试图与你的答案竞争,你得到了该领域钉钉。 – 2013-03-10 02:05:02
现在这是一个答案! – 2013-03-18 10:07:24
非常好,彻底的答案。另外,在存在大量字符串的情况下,“HashSet”或类似的可能是更有效的选择。 – 2013-03-10 01:41:12
@JeremyRoman - 好点。我认为[@assylias](http://*.com/a/15317932/535871)提出了这个建议。 – 2013-03-10 01:42:48
确实。另外,这个数据结构永远不会改变,而且应该是该类的“静态final”成员。 – 2013-03-10 01:44:14