gpt4 book ai didi

java - LinkedList 程序无响应;可能的空指针错误

转载 作者:行者123 更新时间:2023-12-01 13:59:47 24 4
gpt4 key购买 nike

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

问题是,我什至无法判断文件是否存储在列表中,因为每次我为列表发出命令 L 时,程序都会“跳过”它并继续运行,就好像没有询问任何内容一样它的。可能是由于某种原因没有存储该文件,或者 unorderedList 类的 toString 方法可能存在问题。

我所有类(class)的代码如下:

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());
}

}
}

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

有谁知道这里可能发生了什么,或者我可能写错了什么导致我的程序忽略该命令?

最佳答案

查看您的 LinkedList 构造函数

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

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

关于java - LinkedList 程序无响应;可能的空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com