Java & and && 运算符的烦恼

Java & and && operators troubles

我想弄清楚为什么 & 运算符抛出异常并暂停我的程序,但是当我使用 && 运算符时,程序运行没有错误。
这是代码的一部分:

非常感谢您的帮助!

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;
}

java conditional operators 说:

the operators && and || exhibit "short-circuiting" behavior, which means that the second operand is evaluated only if needed.

如果左侧条件为 false,则逻辑 AND 运算符 && 短路 ,另一方面,当左侧条件是 false 右边的条件永远不会被执行。

但是 bitwise & operator 执行按位与运算。

我可以从这里告诉你 & 运算符和 && 运算符之间的区别在于 && 将检查第一个表达式,如果它的计算结果为 false,然后它将简单地中断检查,但是 & 运算符将 运行 以下表达式 不管第一个表达式是否为假。

因此,您编写的代码将检查 (i<(books.size())),无论结果是否为假,!((books.get(i)).areYouBook(a)) 仍将被执行。

但是,如果您使用 &&(i<(books.size())) 为假,则检查的第二部分 !((books.get(i)).areYouBook(a)) 将不会执行。

希望对您有所帮助。

编辑:

您提到当您使用 & 运算符而不是 && 运算符时会抛出错误。由于 & 运算符 执行 运行 第二个表达式,即使第一个表达式为假,我想知道你的第二个表达式是否真的抛出错误,并且当您使用 &.

时被调用

编辑 2:

好的。假设 books 的大小为 12(索引 0-11)只是为了演示。因此,当您使用 & 运算符时,您的 while 循环 运行s 直到 i 为 12。当 i 为 12 时,循环执行 (i<(books.size()))(这returns false) 和 CONTINUES 以执行 !((books.get(i)).areYouBook(a))。在第二个表达式中,当 i 为 12 时,将调用 books.get(i)books 列表仅从索引 0-11 开始,抛出 java.lang.IndexOutOfBoundsException.

您尝试使用的逻辑与由 && 符号表示,即 True && False 解析为 False。单个符号“&”表示按位与,即 0101 & 0100 解析为 0110。