2013-03-12 3 views
0

Извините, если это все сложно понять, но я новичок в программировании, и я просмотрел несколько книг и веб-сайтов, и из моего понимания, что я пытаюсь сделать, должно работать. Назначение, над которым я работаю, это классы, вызывающие классы. Не ставя здесь весь мой код, я постараюсь быть максимально конкретным в неясных областях. Исключение нулевого указателя для этой конкретной строки кода:NPE in line invoking equals()

if(CDList[i].getArtist().equals(artist) == true) 

// CDList представляет собой массив объектов CD (которые создаются в другом классе)

// getArtist() является методом из CD класс, который возвращает строку

// художника в Equals() является объектом сканера пользователь занесены, также Струнный

Суть этого конкретного метода заключается в поиске через массив CDList и сравнить художник Струн, хранящийся у художника Стрин g сканируется и затем совпадает с заголовком. Если найдено, содержимое этой части массива будет удалено. Вот остальная часть метода, если это поможет:

void delete() 
{ 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter artist and title to be deleted: "); 
    String artist = input.nextLine(); 
    String title = input.nextLine(); 

for(int i = 0; i <= numOfCDs; i++) 
{ 
    if(CDList[i].getArtist().equals(artist) == true) 
    { 
     for(int j = 0; j <= numOfCDs; j++) 
     { 
     if(CDList[j].getTitle().equals(title) == true) 
     { 
      System.out.println("Found CD: " + CDList[j].getArtist() + " " +     
       CDList[j].getTitle()); 
      System.out.println("Would you like to delete it? Y/1 N/0 "); 

     if(input.nextInt() == 1) 
      { 
       CDList[j] = null; 
       numOfCDs--; 
      } 
     } 
     else 
      System.out.println("CD not found."); 
     } 
    } 
    else 
     System.out.println("CD not found."); 
} 
} 

К сожалению, вот остальная часть кода. Просто подумал, что это было так, что я бы это оставил.

CD Класс:

package assignment3; 
public class CD 
{ 
    public String artist; 
    public String title; 
    private tracklist listOfTracks = new tracklist(); 

CD(String artistName, String titleName) 
{ 
    artist = artistName; 
    title = titleName; 
} 

public String getArtist() 
{ 
    return artist; 
} 

public String getTitle() 
{ 
    return title; 
} 

public boolean addTrack(String trackInfo) 
{ 
    boolean result = false; 
    if(listOfTracks.add(trackInfo) == true) 
     result = true; 
    return result; 
} 

public int numTracks() 
{ 
    int count = listOfTracks.count(); 
    return count; 
} 

public void display() 
{ 
    System.out.println(" "); 
    System.out.println(getArtist() + " : " + getTitle()); 
    listOfTracks.display(7); 
} 
} 

Треклист Класс:

package assignment3; 
public class tracklist 
{ 
    public String[] tracks; 
    public int numElements; 

    tracklist() 
    { 
     tracks = new String[99]; 
     numElements = 0; 
    } 

    public boolean add(String track) 
    { 
     boolean result = true; 
     int index = 0; 

     while(tracks[index] != null) 
     { 
      index++; 
     }  

     tracks[index] = track; 
     numElements++; 
     if(numElements > 99) 
      result = false; 
     return result; 
    } 

    public int count() 
    { 
     return numElements; 
    } 

    public void display(int indent) 
    { 
     for(int i = 1; i < numElements; i++) 
     { 
      System.out.print(i); 
      if(i >= 10) 
      { 
       for(int j = 0; j < (indent - 1); j++) 
       { 
        System.out.print(" "); 
       } 
      } 
      else 
      { 
       for(int j = 0; j < indent; j++) 
       { 
        System.out.print(" "); 
       } 
      } 
      System.out.println(tracks[i]); 
     } 
    }  
    } 

CDList Класс:

package assignment3; 
import java.util.Scanner; 
public class CDList 
{ 
    public int numOfCDs; 
    private CD[] CDList; 
    private int front,rear; 

    CDList(int size) 
    { 
     CDList = new CD[size]; 
     numOfCDs = 0; 
     front = 0; 
     rear = size - 1; 
    } 

    boolean add() 
    { 
     boolean result; 
     Scanner input = new Scanner(System.in); 
     System.out.println("Enter the Artist Name and CD Title: "); 
     CD userCD = new CD(input.nextLine(), input.nextLine()); 
     System.out.println("Enter the number of tracks: "); 
     int trackNumber = input.nextInt(); 
     System.out.println("Enter your track titles: "); 

     for(int i = 0; i <= trackNumber; i++) 
     { 
      userCD.addTrack(input.nextLine()); 
     } 

     if(rear == front) 
      result = false; 
     else 
     { 
      if(CDList[rear] != null) 
      rear--; 
      else 
       CDList[rear] = userCD; 
      result = true; 
     } 
     return result; 
    } 

    void delete() 
    { 
     Scanner input = new Scanner(System.in); 
     System.out.println("Enter artist and title to be deleted: "); 
     String artist = input.nextLine(); 
     String title = input.nextLine(); 

     for(int i = 0; i <= CDList.length - 1; i++) 
     { 
      if((CDList[i].getArtist().equals(artist)) &&  
      (CDList[i].getTitle().equals(title))) 
      { 
       System.out.println("Found CD of: " + CDList[i].getArtist() + " " +     
       CDList[i].getTitle()); 
       System.out.println("Would you like to delete it? Y/1 N/0 "); 
       if(input.nextInt() == 1) 
       { 
        CDList[i] = null; 
        numOfCDs--; 
       } 
      } 
      else 
       System.out.println("CD not found."); 
     } 
    } 

    void SortArtist() 
    { 
     CD temp = new CD(" ", " "); 
     for(int i = 0; i < numOfCDs; i++) 
      if(CDList[i].getArtist().compareTo(CDList[i + 1].getArtist()) < 0) 
      { 
       temp = CDList[i]; 
       CDList[i] = CDList[i + 1]; 
       CDList[i + 1] = temp; 
      } 
    } 

    void SortTitle() 
    { 
     CD temp = new CD(" ", " "); 
     for(int i = numOfCDs; i > 0; i--) 
     { 
      int x = 0; 
      for(int j = 1; j <= i; j++) 
      { 
       if(CDList[i].getTitle().compareTo(CDList[i + 1].getTitle()) < 0) 
        x = j; 
      } 
      temp = CDList[x]; 
      CDList[x] = CDList[i]; 
      CDList[i] = temp; 
     } 
    } 

    void Display() 
    { 
     for(int i = 0; i <= numOfCDs; i++) 
     { 
      while(CDList[i] == null) 
       i++; 
      CDList[i].display(); 
     } 
    } 

    int size() 
    { 
     return numOfCDs; 
    } 
} 
+4

Не используйте 'if (contition == true)' just use 'if (condition)'. – Pshemo

+1

Вам совсем не нужно '== true'. –

+0

Пожалуйста, укажите пример ввода и вывода. –

ответ

4
if(CDList[i].getArtist().equals(artist) == true) 

Если вы получаете NPE, вот возможности:

  1. CDList является нулевым
  2. CDList[i] является нулевым
  3. CDLIst[i].getArtist() возвращает нулевое значение
  4. класс Artist переопределения equals() и есть ошибка, которая приводит к NPE, но в этом случае NPE будет указывать на заявление в equals().

Вы не показали класс Artist таким образом, мы можем увидеть, если она перекрывает equals(), и не отправил трассировки стека, чтобы мы могли видеть, где именно исключение.

Как прокомментировали другие, == true является излишним.

0

Я бы рекомендовал использовать LinkedList<CD> или ArrayList<CD> вместо CD[].

Это позволит вам легко удалять элементы, например, так:

LinkedList<CD> cdList = new LinkedList<CD>(); 
// add items with cdList.add(...); 
Iterator<CD> cdListIterator = cdList.iterator(); 

// Loop while the list still contains elements. 
while (cdListIterator.hasNext()) { 
    CD thisCd = iterator.next(); 
    // do some operation on the cd to tell whether you want to delete it 
    // for example: 
    if (thisCd.getArtist().equals(artist) && thisCd.getTitle().equals(title)) { 
     iterator.remove(); // it's that simple 
     // Don't have to mess with `cdCount--` or anything. 
    } 
} 

И, как некоторые отметили, что вам не нужно a.equals(b) == true; вы можете просто использовать a.equals(b).

+0

@ user2159150: рад слышать, что вы его нашли. В качестве последней заметки рассмотрим возможность переименования переменной 'CDList' в' cdList'; в Java, по соглашению, классы начинаются с CapitalLetters (например, 'String',' CD', 'File'), а имена переменных (например,' frame', 'args',' button') записываются в camelCase. Это сделает ваш код более понятным для других программистов. – wchargin

0

В этом случае нет ничего плохого в условии. Его проблема с вашей петлей. Используйте один цикл:

for(int i = 0; i <= numOfCDs; i++) 
{ 
    if(CDList[i].getArtist().equals(artist) && CDList[i].getTitle().equals(title)) 
    { 
     System.out.println("Found CD: " + CDList[j].getArtist() + " " + CDList[j].getTitle()); 
     System.out.println("Would you like to delete it? Y/1 N/0 "); 
     if(input.nextInt() == 1) 
      { 
       CDList[i] = null; 
       // do not do numOfCDs-- here 
      } 
    } 
} 
0

Есть целый ряд проблем здесь.

Непосредственной причиной вашего NPE является то, что внутренний контур «удаляет» компакт-диск из списка, назначая его null, а затем внешний цикл пытается проверить компакт-диск в том месте, которое вы только что удалили. Так как это null, вы затем пытаетесь позвонить null.getArtist(), какие NPE.

Первое, что нужно отметить, это то, что вам нужен только один цикл. Тело петли должно проверить, что на компакт-диске, на котором вы смотрите, есть тот же заголовок И художник ...

Следующее, что нужно отметить, это то, что избавиться от лишнего цикла недостаточно. Если метод delete() вызывается более одного раза, второй вызов, скорее всего, встретит запись null, которая была создана при первом вызове ... и вы получите NPE по-прежнему. Тесты должны проверить на null, прежде чем они попытаются получить информацию о названии/исполнителе; например

CD cd = cdList[i]; 
if (cd != null && 
    cd.getArtist().equals(artist) && 
    cd.getTitle().equals(title)) { 
    // ... 
} 

В этот момент возникает проблема с дизайном. Эти значения null в массиве Плохая идея. Есть три исправления:

  • Вы можете удалить компакт-диски, создавая новый массив один элемент меньше ... и копировать на всех компакт-диски, кроме того, удаляемые.

  • Вы можете добавить поле cdListSize и договориться о том, что оно дает вам количество действительных записей в списке. Затем (и это важный бит), когда вы удаляете запись из списка, переместите текущую последнюю запись в место, где была удалена запись, и уменьшите значение cdListSize. Если вы сделаете это последовательно, записи null будут в конце, и вы можете перебирать нуль до cdListSize - 1, чтобы получить ненулевые записи.

  • Лучше всего использовать List, а не массив для представления списка компакт-дисков. API List предоставляет способ удаления записи в заданной позиции. Метод действительно удаляет его ... он не просто устанавливает его на null.

Наконец, вам может потребоваться сделать шаг назад и посмотреть на большее приложение. Предполагается, что список компакт-дисков будет сохранен; например так что он по-прежнему доступен, когда ваше приложение перезагружается? Вероятно, он большой; например слишком большой, чтобы вписаться в память? Возможно, вам захочется выполнить сложные запросы в списке компакт-дисков? Все это предполагает, что вы должны использовать базу данных, а не структуру данных в памяти.

(Тем не менее, с дополнительным кодом вы только что добавили, то ясно, что выходило бы за рамки вашего задания.)

0

Нашел! Спасибо за ваши комментарии, я сделал некоторые изменения, которые я рекомендую. Проблема заключалась в том, что CDList [i] был нулевым. Просто реализовано if (CDList [i] == null), затем продолжите; Благодарю вас за ваш вклад.-