2014-09-13 64 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