2013-10-21 87 views
-1

我一直在試圖編寫一個使用節點文件的隊列,而且我似乎無法弄清楚空指針異常是一個問題。我在網上看了一下,但我對Java太新了,我想知道我在找什麼。任何人都可以找到它,或者至少讓我走向正確的方向?隊列中的Java空指針異常

第一隊:

public class Queue extends CharNode { 
public CharNode head; 
public CharNode tail; 

public Queue(){ 
    this.head = null; 
    this.tail = null;} 

public boolean isEmpty(){ 
    return (head==null);} 

public void enqueue(Character character){ 
    if (isEmpty()){ 
     head.character = character; 
     head.nextNode = tail;} 
    else { 
     CharNode oldTail = tail; 
     tail = new CharNode(); 
     oldTail.character = character; 
     oldTail.nextNode = tail; 
    } 
    } 

public Character dequeue(){ 
    if (isEmpty()) throw new RuntimeException("Queue Empty"); 
    head.character = character; 
    head = head.nextNode; 
    return character; 
}  
public static void main(String[] args){ 
    Queue queue = new Queue(); 
    queue.enqueue('a'); 
    queue.enqueue('b'); 
    System.out.print(queue.dequeue()); 
} 

}

我CharNode文件看起來像:

public class CharNode { 
public Character character; 
public CharNode nextNode; 
public void charNode(Character character){ 
    this.character = character; 
    this.nextNode = null; 
} 

}

而例外,我收到的樣子:

Exception in thread "main" java.lang.NullPointerException 
at Queue.enqueue(Queue.java:14) 
at Queue.main(Queue.java:32) 
+1

首先,'Queue'不應該擴展'CharNode';那裏沒有* is-a *關係。 – chrylis

+0

當然哦。謝謝。 – dawich77

回答

5
public boolean isEmpty(){ 
    return (head==null);} 

public void enqueue(Character character){ 
    if (isEmpty()){ 
     head.character = character; // you have just said that head is NULL 

什麼可能工作是

if (isEmpty()){ 
     head = new CharNode();  // There is no Constructor for CharNode (Character) 
     head.character = character; 
+0

肯定是我第一次看到'if(object == null)'的形式的空檢查//對該對象做某事。 – Radiodef

+0

你必須帶領一個受保護的生活;-)通常也許錯過了一個'!' –

+0

我很困惑,那麼我只想在隊列爲空的情況下分配頭部,這樣我就可以在沒有迭代器。這不是由頭爲空值的代表嗎?我不在這裏? – dawich77

0

的isEmpty()返回true,如果頭爲null。你試圖在導致NPE的enqueue method()中使用null對象的值。 此行: head.character = character;