有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么在另一个类中使用PrintWriter时会出现PrintWriter空指针异常

我已经在任务和支持工具中使用Java有一段时间了,但我从来没有研究过如何在一个类中使用PrintWriter,然后可以从另一个类中使用,例如,我有几个XML文件要解析,然后从单个输入源(一个.xls报告)输出到表,我有几个用于不同XML和子节点的输出文件。所以我创建了这个类来创建一个PrintWriter并报告输出文件是否已经存在:

public class PrintAdmin 
{
    public PrintWriter pout;
    public int PrintFromElement = 0;

    public PrintAdmin(String Dirname) throws IOException
    {
        PrintWriter pout = new PrintWriter(new BufferedWriter(new FileWriter((Dirname))));
        int PrintFromElement = 0;
        File f1 = new File("FirstNode.CSV");
        if(f1.exists()) 
        { PrintFromElement = 1; }
        else
        { PrintFromElement = 0; }
    }
    public void poutclose()
    {
        this.pout.close();
    }

}

这称为:

public class AuditParser 
{
    public static File Auditor;

    public static void main(String[] args) throws IOException 
    { PrintAdmin xmltype1out = new PrintAdmin(xmltype1);
      ...
      for (int xml1 = PrintAdmin.PrintFromElement: xml1 < xml1parsed.header.size();xml1++)
      {
          ...dostuff...
      }

这个模式重复4到5次

我的问题是,虽然我在AuditParser中使用PrintAdmin得到了一个好的编译,但在运行时我得到了一个NullPointerException

我想这样做,让一个简单的类创建一个PrintWriter,它根据文件是否已经存在指示打印头记录。它在这里很有用,我相信它在其他地方也会对我有用


共 (2) 个答案

  1. # 1 楼答案

    问题在于这个

    public PrintWriter pout;
    

    声明了一个实例变量,但它从未初始化,但问题是为什么,因为 在你的构造函数中,你做了这样的事情

    public PrintAdmin(String Dirname) throws IOException{
       PrintWriter pout = new PrintWriter(...);
    }
    

    它正在创建一个新的局部变量pout,并且已初始化,但上面定义的字段从未初始化。你可以这样做来解决这个问题

    public PrintAdmin(String Dirname) throws IOException{
           pout = new PrintWriter(...);
        }
    

    您也不需要在构造函数中再次使用PrintFromElement,因为您已经将它定义为字段

  2. # 2 楼答案

    您在构造函数中定义了一个局部变量,该变量隐藏了字段,但从未赋值。在构造函数中删除PrintWriter标记