实现了获取NullPointerException的方法

时间:2014-08-12 02:07:25

标签: java nullpointerexception null printwriter

我有一个实现的方法访问二叉树的节点。我有一个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();
}

1 个答案:

答案 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}}并期望通过其他调用来设置它 - 它不会。