LinkedList程序没有响应;可能的空指针错误

时间:2013-10-16 16:06:40

标签: java collections nullpointerexception linked-list

好吧,所以我讨厌在一个问题上寻求帮助这么模糊,但我现在正在开展一个项目,似乎没有得到任何编译时错误,但是不会做什么问题它。简而言之,这个项目是一个链接列表(无序列表,具体而言),它起到文本编辑器的作用。它将文件作为命令行参数接收,然后将文档的每个单独行存储为列表中的节点。无论是否确实这样做我都不知道,但之后程序会接受特定的命令(键盘输入)并根据要求编辑或列出文件的文本。

问题是,我甚至无法判断文件是否存储在列表中,因为每次我给出命令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());
        }

    }
}

还有一些其他类和一些接口,但对于我遇到的问题,我认为它们并不相关。

有没有人看到这里可能会发生什么,或者我可能写错了导致我的程序忽略该命令?

1 个答案:

答案 0 :(得分:1)

查看您的LinkedList构造函数

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

head为空但你调用它的setNext方法,它应该抛出一个NPE。