2013-10-16 15 views
0

好的,所以我討厭在一個如此模糊的問題上尋求幫助,但是我現在正在開發一個項目,它似乎沒有得到任何編譯時錯誤,但不會做有什麼要求。簡而言之,這個項目是一個鏈接列表(無序列表,具體),作爲文本編輯器。它將一個文件作爲命令行參數,然後將每個單獨的文檔行作爲節點存儲在列表中。無論是否確實這樣做,我都不知道,但是之後程序會根據請求接收特定的命令(鍵盤輸入)並編輯或列出文件的文本。LinkedList程序無響應;可能的空指針錯誤

問題是,我甚至無法分辨文件是否存儲在列表中,因爲每次我給列表中的命令L時,程序只是「跳過」它並繼續,就好像沒有任何東西問它。可能是因爲任何原因沒有存儲該文件,或者unorderedList類的toString方法可能存在問題。

我所有的類的代碼如下:

public class LinearNode<T> { 

    //Begin by declaring the basic node and its data 
    private LinearNode<T> next; 
    private T element; 

    public LinearNode() { 
     //The basic null constructor 
     next = null; 
     element = null; 

    } 

    public LinearNode(T elem) { 
     //The overloaded constructor to create a node 
     next = null; 
     element = elem; 

    } 

    public LinearNode<T> getNext() { 
     //Get the node reference 
     return next; 

    } 

    public void setNext(LinearNode<T> node) { 
     //Create or redirect a node reference 
     next = node; 

    } 

    public T getElement() { 
     //Get the actual data stored in the node 
     return element; 

    } 

    public void setElement(T elem) { 
     //Create or redirect the node's data 
     element = elem; 

    } 

} 

而對於名單

public abstract class LinkedList<T> implements ListADT<T>, UnorderedListADT<T> { 

    protected int count; 
    protected LinearNode<T> head, tail; 
    protected int modCount; 

    public LinkedList() { 
     count = 0; 
     head = null; 
     tail = null; 
     head = tail; 
     head.setNext(tail); 
     modCount = 0; 
    } 

    public T remove(T targetElement) throws EmptyCollectionException, ElementNotFoundException { 
     if(isEmpty()) 
      throw new EmptyCollectionException("LinkedList"); 

     boolean found = false; 
     LinearNode<T> previous = null; 
     LinearNode<T> current = head; 

     while(current!=null&&!found) { 
      if(targetElement.equals(current.getElement())) { 
       found = true; 
      } 

      else { 
       previous = current; 
       current = current.getNext(); 
      } 

     } 

     if(!found) 
      throw new ElementNotFoundException("Linked List"); 

     if(size()==1) { 
      head = tail = null; 
     } 

     else if(current.equals(head)) 
      head = current.getNext(); 

     else if(current.equals(tail)) { 
      tail = previous; 
      tail.setNext(null); 
     } 

     else { 
      previous.setNext(current.getNext()); 
     } 

     count--; 
     modCount++; 

     return current.getElement(); 
    } 


} 

import java.util.Iterator; 

public class UnorderedList<T> extends LinkedList<T>{ 

    public UnorderedList() { 
     super(); 
    } 

    public void addToFront(T element) { 
     if(head==null) { 
      head = new LinearNode<T>(element); 
      if(tail==null) { 
       tail = head; 
      } 
      count++; 
      modCount++; 
     } 
     else { 
      LinearNode<T> current = head; 
      head.setElement(element); 
      head.setNext(current); 
      count++; 
      modCount++; 
     } 
    } 

    public void addToRear(T element) { 
     if(tail.getElement()==null) { 
      tail.setElement(element); 
      count++; 
      modCount++; 
     } 
     else { 
      LinearNode<T> current = tail; 
      tail = new LinearNode<T>(element); 
      current.setNext(tail); 
      count++; 
      modCount++; 
     } 
    } 

    public void addAfter(T element, T target) { 
     LinearNode<T> current = head; 
     LinearNode<T> node = new LinearNode<T>(element); 
     LinearNode<T> temp = null; 
     while(!(current.getElement()==target)) { 
      current = current.getNext(); 
     } 
     if(!(current.getNext()==null)) { 
      temp = current.getNext(); 
      //temp.setElement(current.getElement()); 
     } 
     current.setNext(node); 
     node.setNext(temp); 
     count++; 
     modCount++; 
    } 

    public T removeLast() { 
     T last = tail.getElement(); 
     tail = null; 
     LinearNode<T> current = head; 
     while(!(current.getNext()==null)) { 
      current = current.getNext(); 
     } 
     current = tail; 
     count--; 
     modCount++; 
     return last; 
    } 

    public int size() { 
     return count; 
    } 

    public Iterator<T> iterator() { 
     Iterator<T> itr = this.iterator(); 
     return itr; 
    } 

    public boolean isEmpty() { 
     boolean result = false; 
     if(head==null&&tail==null) { 
      result = true; 
     } 
     else 
      result = false; 
     return result; 
    } 

    public T first() { 
     return head.getElement(); 
    } 

    public T last() { 
     return tail.getElement(); 
    } 

    public boolean contains(T elem) { 
     boolean result = false; 
     for(T element : this) { 
      if(element==elem) { 
       result = true; 
       break; 
      } 
     } 
     return result; 
    } 

    public T removeFirst() { 
     LinearNode<T> current = head; 
     head = current.getNext(); 
     count--; 
     modCount++; 
     return current.getElement(); 
    } 

    public String toString() { 
     LinearNode<T> current = head; 
     String s = ""; 
     for(int countA=0;countA<count;count++) { 
      s += (countA+1)+"> "+current.getElement()+"\n"; 
      current = current.getNext(); 
     } 
     return s; 
    } 

} 

和主編輯器

import java.util.Scanner; 
import java.util.Iterator; 
import java.io.*; 

public class myEditor { 

    public static void saveToFile(String text, String filename) throws IOException{ 
     PrintWriter out = new PrintWriter(new File(filename)); 
     out.println(text); 
     out.close(); 
    } 

    public static void main(String args[]) { 
     boolean quit = false; 
     try { 
      if(args.length!=1) { 
       throw new IllegalArgumentException(); 
      } 

      String filename = args[0]; 
      Scanner input = new Scanner(new File(filename)); 
      //Add exception 
      UnorderedList<String> list = new UnorderedList<String>(); 
      while(input.hasNextLine()) { 
       if(list.head==null) { 
        list.addToFront(input.nextLine()); 
       } 
       list.addToRear(input.nextLine()); 
      } 

      System.out.println(">"); 

      do { 
       Scanner command = new Scanner(System.in); 
       String comm = command.next(); 
       String[] comm1 = comm.split(" "); 
       if(comm1.length==1) { 
        if(comm1[0].equalsIgnoreCase("I")) { 
         System.out.println("Type a line of text >"); 
         comm = command.next(); 
         list.addToRear(comm); 
        } 
        else if(comm1[0].equalsIgnoreCase("L")) { 
         System.out.print(list.toString()); 
        } 

        else if(comm1[0].equalsIgnoreCase("E")) { 
         saveToFile(list.toString(), filename); 
         quit = true; 
         break; 
        } 
       } 
       else { 
        if(comm1[0].equalsIgnoreCase("I")) { 
         int linNum = Integer.parseInt(comm1[1]); 
         Iterator<String> itr = list.iterator(); 
         String current = ""; 
         for(int count=0;count<linNum;count++) { 
          current = itr.next(); 
         } 
         list.addAfter(comm, current); 
        } 

        else if(comm1[0].equalsIgnoreCase("D")) { 
         int linNum = Integer.parseInt(comm1[1]); 
         if(linNum<=list.count&&linNum>0) { 
          Iterator<String> itr = list.iterator(); 
          String current = ""; 
          for(int count=0;count<linNum;count++) { 
           current = itr.next(); 
          } 
          list.remove(current); 
         } 
        } 
       } 

      } 
      while(!quit); 
     } 
     catch(IllegalArgumentException e) { 
      System.err.print(e.getMessage()); 
     } 
     catch(FileNotFoundException e) { 
      System.err.print(e.getMessage()); 
     } 

     catch(IOException e) { 
      System.err.print(e.getMessage()); 
     } 

    } 
} 

還有一些其他類和一些接口,但對於我遇到的問題,我不認爲它們是相關的。

有沒有人看到這裏可能發生了什麼,或者我可能寫錯了什麼導致我的程序忽略命令?

+0

不應該將您創建的類定義爲通用類(即'LinearNode ')? – Paolo

+0

您是否嘗試過使用調試器?如果這不是一個選項:在讀取列表之後但在獲取命令之前顯示System.out.println(list.size())是什麼? –

+0

@Paolo:他們是;但由於格式不正確而不可見。 – Holger

回答

1

看看你LinkedList構造

head = null; 
    tail = null; 
    head = tail; 
    head.setNext(tail); 

head爲空但你調用它setNext方法,它應該拋出NPE。