2017-04-16 54 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

有趣的是,我從來沒有見過使用這種方式的單個&符。感謝您指出了這一點! –