我有一个实现的方法访问二叉树的节点。我有一个word类,它通过一个名为TreeComparable的接口来实现它。
以下是访问方法:
@Override
public void visit() {
System.out.printf("%-15s%-7s", getWord(), count);
pw.printf("%-15s%-7s", getWord(), count);
ObjectListNode p = list.getFirstNode();
while (p != null) {
System.out.print(((LinePosition) p.getInfo()).getLineNumber() + "-" + ((LinePosition) p.getInfo()).getPosition() + " ");
pw.print(((LinePosition) p.getInfo()).getLineNumber() + "-" + ((LinePosition) p.getInfo()).getPosition() + " ");
p = p.getNext();
}
System.out.println();
pw.println();
}
我收到了PrintWriter对象的错误。我收到一个nullPointerException。我有一个默认构造函数,它是实现此访问方法的类的一部分。
这是创建单词对象时使用的默认构造函数。
public Word(PrintWriter pw) {
this.pw = pw;
}
如果我注释掉试图写入文本文件,那么一切都有效:
@Override
public void visit() {
System.out.printf("%-15s%-7s", getWord(), count);
//pw.printf("%-15s%-7s", getWord(), count);
ObjectListNode p = list.getFirstNode();
while (p != null) {
System.out.print(((LinePosition) p.getInfo()).getLineNumber() + "-" + ((LinePosition) p.getInfo()).getPosition() + " ");
//pw.print(((LinePosition) p.getInfo()).getLineNumber() + "-" + ((LinePosition) p.getInfo()).getPosition() + " ");
p = p.getNext();
}
System.out.println();
//pw.println();
}
但是,对于此分配,我需要将输出打印到文本文件。为什么printwriter对象没有正确传递?感谢任何输入!
编辑: 以下是我尝试调用构造函数的几个地方:
public class Query {
PrintWriter pw;
public Query(PrintWriter pw) {
this.pw = pw;
}
public void performQuery(ObjectBinaryTree t) {
Scanner userInput = new Scanner(System.in);
System.out.println("Search for word: ");
pw.println("Search for word: ");
Word word = new Word(pw);
String input = userInput.next();
do {
word = new Word(input);
if (t.searchBST(word) != null) {
ObjectTreeNode p = t.searchBST(word);
ObjectListNode q = ((Word) p.getInfo()).getList().getFirstNode();
System.out.printf("%-15s%-5s", ((Word) p.getInfo()).getWord(), ((Word) p.getInfo()).getCount());
pw.printf("%-15s%-5s", ((Word) p.getInfo()).getWord(), ((Word) p.getInfo()).getCount());
while (q != null) {
System.out.print(((LinePosition) q.getInfo()).getLineNumber() + "-" + ((LinePosition) q.getInfo()).getPosition() + " ");
q = q.getNext();
}
System.out.println("\nType 1 to exit, or press enter for new search: ");
pw.println("\nType 1 to exit, or press enter for new search: ");
input = userInput.next();
continue;
}
else
System.out.print("Word Not Found");
System.out.println("\nType 1 to exit, or press enter for new search: ");
pw.print("Word Not Found");
pw.println("\nType 1 to exit, or press enter for new search: ");
input = userInput.next();
continue;
} while (!input.equals("1"));
}
}
和
public class Driver {
public static void main(String[] args) throws FileNotFoundException {
PrintWriter pw = new PrintWriter(new File("csis.txt"));
Word word = new Word(pw);
Xref xref = new Xref(pw);
Query query = new Query(pw);
xref.readWords();
System.out.println();
pw.println();
query.performQuery(xref.getBinaryTree());
pw.close();
}
}
编辑: visit()方法是这个接口的一部分(不确定这是否有帮助,但是......):
public interface TreeComparable {
int compareTo(Object o);
void operate(Object o);
void visit();
}
答案 0 :(得分:1)
问题在于:
String input = userInput.next();
do {
word = new Word(input);
您应该收到关于该错误的编译时错误,但显然Word
有一个构造函数,它使用String
而不是PrintWriter
,并且该构造函数不是{\ n}正确设置pw
。这个赋值正在抛弃上面的(正确的)实例化:
Word word = new Word(pw);
看起来你可能会误解对象的静态成员是什么,不是什么。您使用Word
实例化的所有PrintWriter
个对象都会带有pw
的非空值,但除非您修复它,否则其余null
都会Word(String)
。我的猜测是你的pw
构造函数忽略{{1}}并期望通过其他调用来设置它 - 它不会。