我试图弄清楚为什么&
运算符抛出异常并暂停我的程序,但是当我使用&&
运算符时,程序没有错误。
以下是代码的一部分:
books
是对象Book
的arraylist。 areYouBook
如果我要查找的书籍的ISBN匹配true
,则会返回a
。 findBook
检查我是否已在arraylist中拥有该书。当方法返回null
时,表示我必须创建该书并将其添加到ArrayList
。非常感谢你的帮助!
public Book findBook(int a){
int i=0;
while((i<(books.size()))&!((books.get(i)).areYouBook(a)))
i++;
if(i<(books.size()))
return books.get(i);
else
return null;
}
答案 0 :(得分:1)
我可以从这里告诉你,&
运算符和&&
运算符之间的区别在于&&
将检查第一个表达式,如果它的计算结果为false,那么它只会从检查中断,但&
运算符将运行以下表达式,无论第一个表达式是否为假。
因此,您编写的代码将检查(i<(books.size()))
,以及结果是否为假,!((books.get(i)).areYouBook(a))
仍将执行。
但是,如果您使用&&
且(i<(books.size()))
为false,则检查的第二部分!((books.get(i)).areYouBook(a))
将不会被执行。
我希望这会有所帮助。
修改强>
您提到使用&
运算符而不是&&
运算符时抛出的错误。由于&
运算符确实运行第二个表达式,即使第一个表达式为false,我想知道你的第二个表达式是否实际上是一个错误,并在你使用{时被调用{1}}。
编辑2:
确定。让我们说&
的大小为12(索引0-11)仅用于演示。因此,当您使用books
运算符时,while循环将一直运行直到&
为12.当i
为12时,循环执行i
(返回false)并且< strong> CONTINUES 执行(i<(books.size()))
。在第二个表达式中,当!((books.get(i)).areYouBook(a))
为12时,books.get(i)
被调用。i
列表仅从索引0-11开始,抛出books
。
答案 1 :(得分:0)
java conditional operators说:
运算符&amp;&amp; 和 || 表现出“短路”行为,这意味着仅在需要时才会评估第二个操作数。
如果左侧条件为&&
,则逻辑AND运算符false
将短序列,另一方面,当左侧条件为{{1时永远不会执行右侧条件。
但bitwise & operator执行按位AND操作。
答案 2 :(得分:-1)
您尝试使用的逻辑AND由&amp;&amp;&amp;符号即True&amp;&amp; False解析为False。单&符“&amp;”表示按位AND,即0101&amp; 0100解析为0110。