2012-04-11 3 views
1

Для нашей домашней работы я должен принять объекты Chair и добавить их к DoublyLinkedList, которые мы сделали; его нужно сортировать по алфавиту, если стиль одинаковый в алфавитном порядке, мы сортируем по цветуNullPointerException with while loop using compareTo

Когда я пытаюсь пройти цикл, я продолжаю получать NullPointerException.

public void add(Chair element){ 
    if(isEmpty() || first.object.style.compareTo(element.style) > 0 || (first.object.style.compareTo(element.style) == 0 && first.object.color.compareTo(element.color) >= 0){ 
     addFirst(element); 
    }else if(first.object.style.compareTo(element.style) <= 0){ 
     Node temp = first; 
     Node insert = new Node(); insert.object = element; 
     while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs 
      if(temp.hasNext()) 
       temp = temp.next; 
     while(temp.object.style.compareTo(element.style) == 0 && temp.object.color.compareTo(element.color) <= 0) 
      if(temp.hasNext()) 
       temp = temp.next; 
     insert.prev = temp.prev; 
     insert.next = temp; 
     temp.prev.next = insert; 
     temp.prev = insert; 
    } 
} 

Это код, где я помещал информацию в DoublyLinkedList

try{ 
     FileReader fr = new FileReader(filename); 
     Scanner sc = new Scanner(fr); 
     String[] temp; 

     while(sc.hasNext()){ 
      temp = sc.nextLine().split(" "); 
      if(temp[0].equals("Bed")){} 
      else if(temp[0].equals("Table")){ 
      // tables.add(new Table(Integer.parseInt(temp[1]), Integer.parseInt(temp[2]), Integer.parseInt(temp[3]), temp[4])); 
      }else if(temp[0].equals("Desk")){} 
      else if(temp[0].equals("Chair")){ 
       chairs.add(new Chair(temp[1], temp[2])); 
      }else if(temp[0].equals("Bookshelves")){} 
      else{ 
       color = temp[0]; 
      } 
     } 
     while(!chairs.isEmpty()) 
      System.out.println(chairs.removeFirst().info()); 
     System.out.println(); 
     //while(!tables.isEmpty()) 
     // System.out.println(tables.removeFirst().info()); 
    }catch(Exception e){e.printStackTrace();} 

Это класс DoublyLinkedList, что я сделал: класс CDoublyLinkedList { Node первый, последний;

public CDoublyLinkedList(){ 
    first = new Node(); last = new Node(); 
    first.prev = last.next = null; 
    first.object = last.object = null; 
    first.next = last; 
    last.prev = first; 
} 

public boolean isEmpty(){ 
    return first.object == null; 
} 

public void addFirst(Chair element){ 
    Node insert = new Node(); 
    insert.object = element; 
    insert.prev = null; 
    insert.next = first; 
    first.prev = insert; 
    first = insert; 
} 

public void add(Chair element){ 
    if(isEmpty() || first.object.style.compareTo(element.style) > 0 || (first.object.style.compareTo(element.style) == 0 && first.object.color.compareTo(element.color) >= 0){ 
     addFirst(element); 
    }else if(first.object.style.compareTo(element.style) <= 0){ 
     Node temp = first; 
     Node insert = new Node(); insert.object = element; 
     while(first.object.style.compareTo(element.style) <= 0) 
      if(temp.hasNext()) 
       temp = temp.next; 
     while(first.object.style.compareTo(element.style) == 0 && first.object.color.compareTo(element.color) <= 0) 
      if(temp.hasNext()) 
       temp = temp.next; 
     insert.prev = temp.prev; 
     insert.next = temp; 
     temp.prev.next = insert; 
     temp.prev = insert; 
    } 
} 

public Chair removeFirst(){ 
    Chair tobedeleted = first.object; 
    Node temp = first.next; 
    first = temp; 
    first.prev = null; 
    return tobedeleted; 
} 

private class Node{ 
    Node next, prev; 
    Chair object; 
    public boolean hasNext(){ 
     return next != null; 
    } 
} 

}

Класс Председатель:

class Chair extends Furniture{ 
public String style, color; 
public Chair(String s, String c){ 
    style = s; color = c; 
} 
public String toString(){ 
    return color; 
} 
public String getType(){ 
    return "Chair"; 
} 
public String info(){ 
    return (color+", "+style); 
} 
} 

Может кто-то пожалуйста, объясните мне, почему я получаю эту ошибку? Спасибо!

EDIT:

while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs 

chairs.add(new Chair(temp[1], temp[2])); 

java.lang.NullPointerException 
at CDoublyLinkedList.add(Furnish2SS.java:119) 
at Furnish2SS.main(Furnish2SS.java:23) 
java.lang.NullPointerException 
at CDoublyLinkedList.add(Furnish2SS.java:119) 
at Furnish2SS.main(Furnish2SS.java:23) 

EDIT2: РЕШИТЬ!

я изменил свое время цикла на:

while(temp.object != null && element != null && (temp.object.compareTo(element) == 0 || temp.object.compareTo(element) == -1)) 

Причина я получил ошибку, потому что я не проверял на null каждой итерации.

+0

Один или многие из ваших внутренних объектов кажутся нулевыми, или объект или стиль попробуйте поместить цикл в try catch, чтобы получить внутреннее исключение. – legrandviking

+5

Вы получаете ошибку, потому что что-то пусто. Чтобы узнать, что, посмотрите на стек и посмотрите, в какой строке говорится, что произошло исключение. – trutheality

+0

Существует объект, который упоминается в проекте, который не был создан или установлен в null. Отлаживайте программу и, пожалуйста, сообщите нам, в какой строке находится ваша ошибка. Это может даже помочь вам решить вашу собственную проблему. – parion

ответ

2

Вы говорите, что это строка кода вызывает исключение:

while(temp.object.style.compareTo(element.style) <= 0) 

Вы, вероятно, следует установить отладчик точку останова на этой линии и использовать отладчик, чтобы определить, какие из значений равно нулю. Но мне сложно объяснить здесь полные инструкции о том, как настроить и использовать отладчик (это не значит, что вы не должны учиться! Вы должны. Есть много учебников. Google это.) Поэтому вместо написания учебника по отладчики, я просто разместить код, который подскажет вам, какая переменная равна нулю:

if (temp == null) { 
    System.out.println("temp is null"); 
} else if (temp.object == null) { 
    System.out.println("temp.object is null"); 
} else if (temp.object.style == null) { 
    System.out.println("temp.object.style is null"); 
} 

if (element == null) { 
    System.out.println("element is null"); 
} else if (element.style == null) { 
    System.out.println("element.style is null"); 
} 


while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs 
{ 
    if(temp.hasNext()) 
     temp = temp.next; 

    if (temp == null) { 
     System.out.println("loop: temp is null"); 
    } else if (temp.object == null) { 
     System.out.println("loop: temp.object is null"); 
    } else if (temp.object.style == null) { 
     System.out.println("loop: temp.object.style is null"); 
    } 

    if (element == null) { 
     System.out.println("loop: element is null"); 
    } else if (element.style == null) { 
     System.out.println("loop: element.style is null"); 
    } 

} 

Если использовать приведенные выше утверждения кода, чтобы заменить эти три строки кода:

while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs 
     if(temp.hasNext()) 
      temp = temp.next; 

вы будете знать, какая переменная имеет значение null, на основании которой печатается утверждение. Надеюсь, вы сможете взять его оттуда. (Обычный способ исправить исключение NullPointerException состоит в том, чтобы предпринять шаги, необходимые для обеспечения того, чтобы оскорбительная нулевая переменная фактически имела действительное значение, отличное от нуля, к тому времени, когда программа достигнет строки исключения NullPointerException).

+0

Хороший ответ. Но, может быть, немного жестоко ... –

+0

Дело в том, что я просто поставил все это в попытку, и хотя он генерирует исключение, код в цикле while работает. Я также попытался проверить «temp == null» и ничего не распечатал. – prunes4u

+0

Я исправил его. По какой-то причине код работает нормально, но генерируется исключение NullPointerException. Я просто извлек трассировку стека, и он распечатывает информацию так, как я ее хочу. – prunes4u

2

Взгляните на addFirst(Chair element). Этот метод действительно запутан. Он создает новый Node, который содержит правильные Chair. Затем он устанавливает prev в null. Затем он устанавливает next в first. И это то, что вызывает все ваши проблемы. Потому что first указывает на пустой Node.Вы в итоге:

first указывает на ваш новый Node. Это указывает на Node, который не содержит Chair. Это снова указывает на last.

е:

Ваш весь код выглядит, как вы, по крайней мере, два различных подхода по реализации списка и бросил их toghether. Есть еще несколько ошибок, но поскольку это домашнее задание, я думаю, это не так уж плохо, если вы сначала попытаетесь его исправить.

Если вы не можете понять, как исправить это, спросите здесь.

PS: Извините за все редактирование и (un) удаление моих ответов (если вы заметили). Я немного устал и продолжал вызывать новые ошибки, исправляя старые, пока, наконец, не понял, что является истинной причиной всего этого.

+0

+1 за то, что он действительно помог ему с логикой его кода. Я не был достаточно храбр! –