2014-09-13 81 views
0

我試圖在書店程序中運行getBook()方法,它可以讓我找到存儲在AL 書籍中的書籍,不僅如果標題和作者是正確的,而且如果其中之一他們是空的。 所以,我寫了這個代碼:Java:如果條件設置

public Book getBook(String author, String title){ 
    boolean condOk = false; 
    Book book = null; 
    if(books!=null){ 
     for(int i=0; i<books.size(); i++){ 
      if((author==null && title.equals(books.get(i).getTitle())) || 
        (author.equals(books.get(i).getAuthor()) && title==null)){ 
       condOk = true; 
       book = books.get(i); 
       break; 
      } else if(title.equals(books.get(i).getTitle()) && 
        author.equals(books.get(i).getAuthor())){ 
       condOk = true; 
       book = books.get(i); 
       break; 
      } 
     } 
    } 
    if(condOk==false) return null; 
    else return book; 
} 

這部分的J-單元測試(不是由我創建),放入 4個對象(有構造函數:標題字符串,字符串作者,... ),然後測試方法getBook()三次:作者和標題,標題表達和作者null,以及最後一次情況相反。

我已經嘗試了一些東西,我注意到如果我用邏輯op替換所有的equals()調用==一切正常。 在Book類中,一切都是正確的,所有的getter和setter都在正確的位置。

那麼,爲什麼我會得到這樣的行爲,當我讀了幾次比較字符串與equals()比用==做得更好?

+0

「如果我用邏輯操作符==代替所有的equals()調用,一切正常」 - 看起來更可能是該語句是錯誤的結論,因爲'equals' *是正確的方法來比較不同的字符串。對於引用類型,只有當a和b是*相同*實例時,'a == b'纔會返回true。 – user2864740 2014-09-13 06:32:01

+0

你說「等於中斷」是什麼意思? – 2014-09-13 06:34:39

+0

@ user2864740不一定。在這種情況下,使用相同的字符串常量的引用。這就是爲什麼它工作正常 – ponomandr 2014-09-13 06:34:43

回答

0

例如,如果標題爲空且作者與列表中的書不相同,則會遇到NullPointerException。第一個if的條件爲false,因此您輸入else部分,如果無法評估第二個條件,因爲在title.equals(books.get(i).getTitle())標題爲空。

如果您使用==,則不會發生這種情況,允許使用==比較空值。

+0

但是現在我的問題是(並且它也適合以前的註釋):如果我的代碼與'=='一起工作(即兩個對象是相同的),那不會自動地意味着這兩個作者或標題值是相同的? 總之,爲什麼在我的情況下,如果我使用equals()或者== ==不一樣? – 2014-09-13 07:26:24

+0

你得到不同的結果,因爲'null == null'可以,而'null.equals(null)'給出'NullPointerException'。 – Henry 2014-09-13 08:53:37

+0

非常感謝! – 2014-09-13 14:03:40