2014-09-13 3 views
0

Я пытаюсь запустить метод getBook() в программе Bookstore, которая может позволить мне найти книгу, хранящуюся в книгах , не только в том случае, если заголовок и автор верны, но и если один из они равны нулю. Итак, я написал этот код: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-Unit (не создана мной) этой части, ставит в книг 4 объектов (с конструктором: Строка заголовка, строка автора, ...), а затем три раза проверяет метод getBook(): с автором и заголовком, с выражением заголовка и автором null, и в последний раз с противоположной ситуацией.

Я уже что-то пробовал, и заметил, что если я заменю все вызовы equals() логическим оператором op ==, все будет хорошо. В классе книги все правильно, все геттеры и сеттеры находятся в нужном месте.

Итак, почему я получаю такое поведение, когда несколько раз я читал, что сравнение строк с equals() лучше, чем выполнение с ==?

+0

«Если я заменяю все вызовы equals() логическим оператором op ==, все работает нормально» - кажется более вероятным, что оператор является неправильным выводом, потому что 'equals' * является * правильным методом для сравнения значения разные строки. Для ссылочных типов 'a == b' возвращает true только тогда, когда a и b являются * одинаковыми * экземплярами. – user2864740

+0

Что вы подразумеваете под словом «equals is broken»? –

+0

@ user2864740 Не обязательно. В этом случае используются ссылки на те же строковые константы. Вот почему он отлично работает – ponomandr

ответ

0

Вы работаете в NullPointerException, например, если title имеет значение null, а автор не равен книге в списке. Условие первого if является ложным, поэтому вы вводите часть else и условие второй, если не можете быть оценены, потому что в title.equals(books.get(i).getTitle()) заголовок имеет значение null.

Этого не происходит, если вы используете ==, разрешено сравнивать нулевые значения с ==.

+0

Но теперь мой вопрос (и он соответствует предыдущим комментариям тоже): если мой код работает с '==' (то есть оба объекта одинаковы), не означает, что это автоматически означает также, что два авторы или названия имеют одинаковые значения? Короче говоря, почему в моем случае это не то же самое, если я использую 'equals()' или '=='? –

+0

Вы получаете разные результаты, потому что 'null == null' в порядке, в то время как' null.equals (null) 'дает' NullPointerException'. – Henry

+0

Большое спасибо! –

Смежные вопросы