链接列表程序无响应;可能的空指针错误



好吧,所以我讨厌就一个如此模糊的问题寻求帮助,但我现在正在处理一个项目,该项目似乎没有任何编译时错误,但不会做它所要求的。简单地总结一下,这个项目是一个链表(无序列表,具体来说),它充当文本编辑器。它将文件作为命令行参数,然后将文档的每一行单独存储为列表中的节点。我不知道它是否肯定这样做,但在那之后,程序会接收特定的命令(键盘输入)并根据要求编辑或列出文件的文本。

问题是,我什至无法判断文件是否存储在列表中,因为每次我给命令 L for list 时,程序都会"跳过"它并继续前进,就好像什么都没有要求一样。可能是由于某种原因未存储该文件,或者 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());
        }
    }
}

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

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

查看你的LinkedList构造函数

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

head为 null 但您调用其 setNext 方法,它应该抛出一个 NPE。

相关内容

  • 没有找到相关文章

最新更新