Java & and && 运算符的烦恼
Java & and && operators troubles
我想弄清楚为什么 &
运算符抛出异常并暂停我的程序,但是当我使用 &&
运算符时,程序运行没有错误。
这是代码的一部分:
books
是对象数组列表 Book
。
areYouBook
returns true
如果这本书的 ISBN 我正在寻找匹配项 a
。
- 方法
findBook
检查数组列表中是否已经有这本书。当方法 returns 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;
}
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。
我想弄清楚为什么 &
运算符抛出异常并暂停我的程序,但是当我使用 &&
运算符时,程序运行没有错误。
这是代码的一部分:
books
是对象数组列表Book
。areYouBook
returnstrue
如果这本书的 ISBN 我正在寻找匹配项a
。- 方法
findBook
检查数组列表中是否已经有这本书。当方法 returnsnull
时,这意味着我必须创建这本书并将其添加到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;
}
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。