2017-04-16 52 views
-1

我想弄清楚为什么&运算符抛出一个异常并暂停我的程序,但是当我使用&&运算符时,程序没有错误地工作。
下面是代码的所述部分:Java&和&&运营商的麻烦

  • books是对象Book的ArrayList。
  • areYouBook返回true如果书的ISBN我正在寻找匹配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; 
} 
+1

因为'&'是[按位与运算符](https://docs.oracle.com/javase/tutorial/java/nutsandbolts /operators.html),而不是逻辑AND。 – domsson

+2

此外,我强烈建议您始终使用大括号{}}来代替块('while,'if','else')并正确缩进代码。这不仅难以阅读和理解,而且必然会以您不想要的方式执行。 – domsson

+1

[&和&&之间的区别](http://stackoverflow.com/questions/5564410/difference-between-and) – matoni

回答

1

我可以告诉你,从这里说的&运营商和&&运营商之间的不同之处在于&&将检查第一expresion,如果计算结果为假,那么它会简单地从检查突破,但&操作将运行以下表达式,而不管第一个结果是否为假。

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

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

我希望这会有所帮助。

编辑:

你提到一个错误,当您使用&运营商,而不是运营商&&被抛出。由于&运算符确实运行第二个表达式,即使第一个表达式为假,我想知道如果您的第二个表达式实际上是抛出一个错误,并且当您使用&时被调用。

编辑2:

确定。假设books的大小为12(索引0-11),仅供演示。所以,当你使用&操作,while循环运行,直到i是12.当i为12,循环执行(i<(books.size()))(返回FALSE)和CONTINUES执行!((books.get(i)).areYouBook(a))。在第二个表达式中,正在调用books.get(i),当i是12. books列表仅从索引0-11开始,抛出java.lang.IndexOutOfBoundsException

+0

谢谢,但是当我使用&&该程序完美工作,但如果我使用&,我得到此错误消息“在线程中的异常”主“java.lang.IndexOutOfBoundsException:索引:0,大小:0 \t在Java .util.ArrayList.rangeCheck(Unknown Source) \t at java.util.ArrayList.get(Unknown Source)“ –

+0

@ AilinW.B。啊,这很有道理。让我编辑我的答案;我看到发生了什么... –

+0

错误异常是在索引0,我认为这是因为arraylist是空的,对吧? –

0

的Java conditional operators说:

运营商& &||表现出“短路”行为,这意味着仅在需要时评估第二个操作数。

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

bitwise & operator执行按位AND操作。

-1

的逻辑和你正在尝试使用由& &符号即真& &假解析为false表示。单符号“&”代表按位与,即0101 & 0100解析为0110.

+0

也可以使用单个&符号代替双和号并稍作更改;无论第一个结果是否为真,单个&符将始终执行以下表达式。 –

+2

有趣的是,我从来没有见过使用这种方式的单个&符。感谢您指出了这一点! –