Java创建一个类将ArrayList打印到文件

Java创建一个类将ArrayList打印到文件,java,class,file-io,printwriter,Java,Class,File Io,Printwriter,这是我的密码 这是我的PrintToFile类 import java.util.*; import java.io.*; public class PrintToFile{ File f; FileWriter fw; PrintWriter pw; public void PrintToFile()throws Exception{//remove void from constructor File f = new F

这是我的密码

这是我的PrintToFile类

import java.util.*;
import java.io.*;

public class PrintToFile{
        File f;
        FileWriter fw;
        PrintWriter pw;

    public void PrintToFile()throws Exception{//remove void from constructor
      File f = new File ("Output.txt");//dont reinitialize 
      FileWriter fw = new FileWriter(f, true);//dont reinitialize 
     PrintWriter pw = new PrintWriter(fw);//dont reinitialize 
   }

    public void printExp(ArrayList<Expense> expList){
        for(int i = 0; i < expList.size(); i++){
         pw.println("---------------------------------------");//exception here
         pw.println(expList.get(i));
      }
        pw.close();
    }
}
我已经将expList定义为对象的ArrayList

我得到的例外是

Exception in thread "main" java.lang.NullPointerException

发生在有标记的地方。我的问题是,是什么导致了这种异常?谢谢

您没有创建
pw
的对象,它是类字段,但是您正在创建
pw
的对象,它是方法
PrintToFile()
的本地对象。因此,默认情况下,
PrintToFile.pw
为空,您将得到
NPE

将方法更改为在构造函数中遵循或初始化
pw
f
fw
(推荐):


您不是在创建类字段的
pw
对象,而是在创建方法
PrintToFile()
本地的
pw
对象。因此,默认情况下,
PrintToFile.pw
为空,您将得到
NPE

将方法更改为在构造函数中遵循或初始化
pw
f
fw
(推荐):

而不是:

File f = new File ("Output.txt");
FileWriter fw = new FileWriter(f, true);
PrintWriter pw = new PrintWriter(fw);
按以下步骤进行:

f = new File ("Output.txt");
fw = new FileWriter(f, true);
pw = new PrintWriter(fw);
您正在构造函数中再次声明局部变量。实例变量保持默认值(即null)的初始化状态。

而不是:

File f = new File ("Output.txt");
FileWriter fw = new FileWriter(f, true);
PrintWriter pw = new PrintWriter(fw);
按以下步骤进行:

f = new File ("Output.txt");
fw = new FileWriter(f, true);
pw = new PrintWriter(fw);

您正在构造函数中再次声明局部变量。实例变量保持默认值(即null)的初始化状态。

pw在构造函数中未设置为全局变量。同时修复你的构造函数,它不应该是空的

import java.util.*;
import java.io.*;

public class PrintToFile
{
    File f;
    FileWriter fw;
    PrintWriter pw;

    public PrintToFile() throws Exception{
        f = new File ("Output.txt");
        fw = new FileWriter(f, true);
        pw = new PrintWriter(fw);
    }

    public void printExp(ArrayList<Expense> expList)
    {
        for(int i = 0; i < expList.size(); i++)
        {
            pw.println("---------------------------------------");//exception here
            pw.println(expList.get(i));
        }
        pw.close();
    }
}
import java.util.*;
导入java.io.*;
公共类打印文件
{
文件f;
文件编写器;
印刷作家;
公共PrintToFile()引发异常{
f=新文件(“Output.txt”);
fw=新文件写入程序(f,true);
pw=新的打印书写器(fw);
}
public void printExp(ArrayList expList)
{
对于(int i=0;i
pw未在构造函数中设置为全局变量。同时修复你的构造函数,它不应该是空的

import java.util.*;
import java.io.*;

public class PrintToFile
{
    File f;
    FileWriter fw;
    PrintWriter pw;

    public PrintToFile() throws Exception{
        f = new File ("Output.txt");
        fw = new FileWriter(f, true);
        pw = new PrintWriter(fw);
    }

    public void printExp(ArrayList<Expense> expList)
    {
        for(int i = 0; i < expList.size(); i++)
        {
            pw.println("---------------------------------------");//exception here
            pw.println(expList.get(i));
        }
        pw.close();
    }
}
import java.util.*;
导入java.io.*;
公共类打印文件
{
文件f;
文件编写器;
印刷作家;
公共PrintToFile()引发异常{
f=新文件(“Output.txt”);
fw=新文件写入程序(f,true);
pw=新的打印书写器(fw);
}
public void printExp(ArrayList expList)
{
对于(int i=0;i
删除void(构造函数没有void或任何返回类型)。 和declarete变量只有一次

import java.util.*;
import java.io.*;

public class PrintToFile
{
    File f;
    FileWriter fw;
    PrintWriter pw;

    public PrintToFile() throws Exception
    {
        f = new File ("Output.txt");
        fw = new FileWriter(f, true);
        pw = new PrintWriter(fw);
    }

    public void printExp(ArrayList<Expense> expList)
    {
        for(int i = 0; i < expList.size(); i++)
        {
            pw.println("---------------------------------------");
            pw.println(expList.get(i));
        }
        pw.close();
    }
}
import java.util.*;
导入java.io.*;
公共类打印文件
{
文件f;
文件编写器;
印刷作家;
公共PrintToFile()引发异常
{
f=新文件(“Output.txt”);
fw=新文件写入程序(f,true);
pw=新的打印书写器(fw);
}
public void printExp(ArrayList expList)
{
对于(int i=0;i
删除void(构造函数没有void或任何返回类型)。 和declarete变量只有一次

import java.util.*;
import java.io.*;

public class PrintToFile
{
    File f;
    FileWriter fw;
    PrintWriter pw;

    public PrintToFile() throws Exception
    {
        f = new File ("Output.txt");
        fw = new FileWriter(f, true);
        pw = new PrintWriter(fw);
    }

    public void printExp(ArrayList<Expense> expList)
    {
        for(int i = 0; i < expList.size(); i++)
        {
            pw.println("---------------------------------------");
            pw.println(expList.get(i));
        }
        pw.close();
    }
}
import java.util.*;
导入java.io.*;
公共类打印文件
{
文件f;
文件编写器;
印刷作家;
公共PrintToFile()引发异常
{
f=新文件(“Output.txt”);
fw=新文件写入程序(f,true);
pw=新的打印书写器(fw);
}
public void printExp(ArrayList expList)
{
对于(int i=0;i
谢谢大家!不确定是否会投反对票??但是感谢所有的答案,它现在可以完美地工作了+1可能有人在抱怨你的缩进风格;)正如您现在可能意识到的,无论何时“声明”变量(将数据类型(例如文件)放在变量前面),它都会创建一个新变量。因此,您有两个名为“f”的文件类型变量。当一个变量被声明时,它被限制在它的大括号内。当括号退出时,变量将超出范围。当变量名发生冲突时,最小的作用域获胜。因此,PrintToFile()构造函数中的“文件f”盖过了“文件f”类变量。谢谢大家!不确定是否会投反对票??但是感谢所有的答案,它现在可以完美地工作了+1可能有人在抱怨你的缩进风格;)正如您现在可能意识到的,无论何时“声明”变量(将数据类型(例如文件)放在变量前面),它都会创建一个新变量。因此,您有两个名为“f”的文件类型变量。当一个变量被声明时,它被限制在它的大括号内。当括号退出时,变量将超出范围。当变量名发生冲突时,最小的作用域获胜。因此,PrintToFile()构造函数中的“File f”盖过了“File f”类变量。