簡體   English   中英

LinkedList程序無響應; 可能的空指針錯誤

[英]LinkedList program unresponsive; possible null pointer error

好吧,所以我不想為一個如此模糊的問題尋求幫助,但是我現在正在開發一個項目,該項目似乎沒有遇到任何編譯時錯誤,但不會按照要求進行操作。 簡而言之,該項目是一個鏈接列表(具體來說是無序列表),用作文本編輯器。 它以文件作為命令行參數,然后將文檔的每一行存儲為列表中的節點。 我不確定它是否執行此操作,但是在此之后,程序將接收特定命令(鍵盤輸入)並根據要求編輯或列出文件的文本。

問題是,我什至不知道文件是否存儲在列表中,因為每次我給列表的命令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());
        }

    }
}

還有其他一些類和一些接口,但是對於我遇到的問題,我認為它們沒有那么重要。

有人看到這里發生了什么,或者我寫錯了什么導致我的程序忽略了該命令嗎?

查看您的LinkedList構造函數

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

head為null,但是您調用了它的setNext方法,它應該拋出一個NPE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM