Java创建一个类将ArrayList打印到文件
这是我的密码 这是我的PrintToFile类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
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”类变量。