使用BufferedWriter尝试写入文件时获取NPE。我做错了什么?

时间:2015-02-14 23:01:04

标签: java nullpointerexception binary-tree

我有树设置。我想使用BufferedWriter将其保存到txt文件中。它创建文件,然后当我的程序第一次调用BufferedReader的write方法(第102行)时它会遇到一个空指针异常,所以我猜它没有正确初始化?注意:“node”只是root的有效负载,我可以使用相同的方法打印树,所以问题不在于节点变量。

public class TreeNode {
    File file;
    BufferedWriter writer;
    FileWriter fw;

    public void save() /// save tree into txt file
    {

        try 
        {
            file = new File("save.txt");
            if(!file.exists())
            {
                file.createNewFile();
            }
            fw = new FileWriter(file);
            writer = new BufferedWriter(fw);
            print();

        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }

    }
    public void print() {
        try 
        {
            writer.write(node); //line 102
            writer.newLine();
            if (no != null) 
            {
                no.print();
                writer.newLine();
            }
            if (yes != null) 
            {
                yes.print();
                writer.newLine();
            }
            writer.flush();
            writer.close();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }

        }
}

错误:

    Exception in thread "main" java.lang.NullPointerException
    at TreeNode.print(TreeNode.java:102)
    at TreeNode.print(TreeNode.java:106)
    at TreeNode.save(TreeNode.java:90)
    at TreeNode.playagain(TreeNode.java:59)
    at TreeNode.go(TreeNode.java:189)
    at CelebrityGame.main(CelebrityGame.java:22)

1 个答案:

答案 0 :(得分:1)

您的问题是,您有多个TreeNode个实例,但只有外部实例填充了writer

您可以在堆栈跟踪中看到外部编写器实际上已成功进入第106行,其中调用no.print()。这是另一个节点对象。然后在这个对象中,它在第102行失败了,因为编写器是空的。

最好从字段中删除writer并将其作为参数传递给print(),不要将其他变量存储为字段(file + {{1或者)。