Java 输入不为'时执行循环;a还是b?

Java 输入不为'时执行循环;a还是b?,java,boolean-logic,Java,Boolean Logic,我正在为一个课堂项目做最后的润色,我正在为我的一个用户输入添加一个安全网。我将其设置为,如果用户输入“1”或“2”,他们输入的数据将以不同的方式显示。我想添加一个方法,防止用户输入除“1”或“2”以外的任何内容。这是它的代码 do { System.out.println("Please type either '1' or '2'."); Scanner scan = new Scanner(System.in); a = scan.nextInt(); } while (a != (1||2

我正在为一个课堂项目做最后的润色,我正在为我的一个用户输入添加一个安全网。我将其设置为,如果用户输入“1”或“2”,他们输入的数据将以不同的方式显示。我想添加一个方法,防止用户输入除“1”或“2”以外的任何内容。这是它的代码

do
{
System.out.println("Please type either '1' or '2'.");
Scanner scan = new Scanner(System.in);
a = scan.nextInt();
}
while (a != (1||2));
//after user enters 1 or 2, return the choice
return a;

我一直在读操作数和逻辑,但我有点被卡住了。我一直在缠着我的老师,所以我想我应该让他休息一下,因为我不是他唯一的学生。我的错误是说“二进制运算符“| |”的操作数类型不正确。

它是
(a!=1&&a!=2)
-当a是1或2时,您实际上想要退出循环。

它是
(a!=1&&a!=2)
-实际上,当a为1或2时,您希望退出循环。

您需要对
a!=1
a!=2执行单独的条件语句

您的条件语句应该如下所示:

(a!=1) && (a!=2)

您需要为
a!=1
a!=2
执行单独的条件语句

您的条件语句应该如下所示:

(a!=1) && (a!=2)

这里的问题是,您试图编写的代码读起来像英语一样有意义,但实际情况并非如此。
|
运算符接受两个表达式,并返回其中一个表达式是否为
true
。这意味着您编写的代码没有意义

最简单的替换方法是将其展开:

a != 1 && a != 2
(我们需要使用
&&
,因为我们正在检查它们是否都是真的)

请注意,这可能会变得冗长和笨拙。或者,一个好的替代方法(假设您有很多值要检查)是在集合中进行成员身份检查(一个
集合
是一个不错的选择,因为您可以保证进行O(1)成员身份测试)。例如:

Set possibles=new HashSet();
addAll(可能,新整数[]{1,2,…});
而(!possibles.contains(a)){
...

这里的问题是,您试图编写的代码读起来像英语一样有意义,但实际情况并非如此。
|
运算符接受两个表达式,如果其中一个表达式为
true,则返回该表达式。
。这意味着您编写的代码没有意义

最简单的替换方法是将其展开:

a != 1 && a != 2
(我们需要使用
&&
,因为我们正在检查它们是否都是真的)

请注意,这可能会变得冗长和笨拙。或者,一个好的替代方法(假设您有很多值要检查)是在集合中进行成员身份检查(一个
集合
是一个不错的选择,因为您可以保证进行O(1)成员身份测试)。例如:

Set possibles=new HashSet();
addAll(可能,新整数[]{1,2,…});
而(!possibles.contains(a)){
...

不能将
int
当作伪
regex
处理。替换

while (a != (1||2));


不能将
int
视为pseudo-
regex
。替换

while (a != (1||2));


在while循环条件下尝试此操作

((a!=1) && (a!=2))

在while循环条件下尝试此操作

((a!=1) && (a!=2))
你必须写作

while (a != 1 && a != 2)
因为它相当于而不是
(a==1 | | a==2)
你必须写

while (a != 1 && a != 2)

因为它等价于而不是
(a==1 | | a==2)

二进制运算符“| |”两边都需要两个布尔操作数。由于操作数是整数,这是一个语法错误

你应该这样做:

do{
// core of the loop...
}while(a!=1 && a!=2);

二进制运算符“| |”两侧需要两个布尔操作数。由于操作数是整数,这是一个语法错误

你应该这样做:

do{
// core of the loop...
}while(a!=1 && a!=2);

这是学习编程时常见的误解

作为一个人,你可以很容易地阅读这样的语句:“a不是1或2”,但计算机必须遵循某些规则,其中一条规则是“或”优先

这意味着它首先试图弄清楚“1或2”的含义,因为基本上,你的陈述与此相似:

while (a != SOMETHING);
Java语言中的
|
是“逻辑or”,它的意思是:取
|
(称为运算符)两侧的两个值(称为操作数),并根据“逻辑or”规则组合它们

“logical or”使用两个布尔值,它们只能是True或False,因为您要求它将运算符与数字一起使用,所以您会收到特定的错误消息

如果您尝试使用单管道,
|
,编译器可能已经停止抱怨,但它仍然不会执行您希望它执行的操作

1或2
处理数字时,使用
|
运算符,即“按位或”运算符,可以将两个数字组合成数字3。如果您想知道原因,可以阅读有关“按位运算符”的更多信息

简而言之,你不能这样写比较

在编程语言中,一次比较两个值,即一个值与另一个值进行比较,因此您唯一的选择是展开表达式进行两次比较

下面是一些等价的表达式,它们将为您提供您想要的:

while (a != 1 && a != 2);
或者这个:

while (!(a == 1 || a == 2));

老实说,我更喜欢第一个。

这是学习编程时常见的误解

作为一个人,你可以很容易地阅读这样的语句:“a不是1或2”,但计算机必须遵循某些规则,其中一条规则是“或”优先

这意味着它首先试图弄清楚“1或2”的含义,因为基本上,你的陈述与此相似:

while (a != SOMETHING);
Java语言中的
|
是“逻辑or”,它的意思是:取
|
(称为运算符)两侧的两个值(称为操作数),并根据“逻辑or”规则组合它们

“逻辑或”使用两个布尔值,这两个值只能