我在这里声明了一个数组和变量。 productList数组,名称,价格和数量
import java.io.*;
import java.util.*;
public class ReadingAndWritting {
public String name;
public double price;
public int number;
public ReadingAndWritting[] productList = new ReadingAndWritting[3];
public ReadingAndWritting() {
}
public ReadingAndWritting(String name, double price, int number) {
this.name = name;
this.price = price;
this.number = number;
}
public void printContents() {
int i = 0;
try {
FileReader fl = new FileReader("Product List.txt");
Scanner scn = new Scanner(fl);
while (scn.hasNext()) {
String productName = scn.next();
double productPrice = scn.nextDouble();
int productAmount = scn.nextInt();
System.out.println(productName + " is " + productPrice + " pula. There are " + productAmount + " items left in stalk.");
productList[i] = new ReadingAndWritting(productName, productPrice, productAmount);
i = i + 1;
}
scn.close();
} catch (IOException exc) {
exc.printStackTrace();
} catch (Exception exc) {
exc.printStackTrace();
}
}
public void writeContents() {
try {
//FileOutputStream formater = new FileOutputStream("Product List.txt",true);
Formatter writer = new Formatter(new FileOutputStream("Product List.txt", true));
for (int i = 0; i < productList.length; ++i) {
writer.format(name, (price + 100.0), (number - 1), "\n");
}
writer.close();
} catch (IOException exc) {
exc.printStackTrace();
}
}
public static void main(String[] args) {
ReadingAndWritting obj = new ReadingAndWritting();
System.out.println("_____THIS IS THE BEGINNING OF THE PRODUCT LIST_____");
obj.printContents();
System.out.println("_____THIS IS THE END OF THE PRODUCT LIST_____");
System.out.println("_____THIS IS THE BEGINNING OF THE PRODUCT LIST_____");
obj.writeContents();
obj.printContents();
System.out.println("_____THIS IS THE END OF THE PRODUCT LIST_____");
}
}
&#13;
每次运行代码时,它都会保留格式化现有文件,然后报告NullPointerException。我完全迷失了如何解决这个问题,而我们的讲师从未涉及过它。请
productList []数组包含每个标识符中包含的名称,价格和数字值。我想擦除现有文件的内容,然后使用新值写入以更新数组中的内容
答案 0 :(得分:2)
您正在使用的构造函数截断输入文件,如Javadoc中所述:
fileName 要用作此格式化程序目标的文件的名称。如果该文件存在,那么它将截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。
您可以使用其他构造函数,例如Formatter(OutputStream os)
来避免截断。
Formatter writer = new Formatter(new FileOutputStream("Product List.txt",true));
至于NullPointerException
,请看你的评论:
public String name;
name
未初始化,默认情况下为null
,这会导致NullPointerException
。
P.S。我不知道productList
是什么,基于它的名称以及你在迭代它的事实,也许你应该从该列表的元素中得到price
和name
编辑:
根据代码的其余部分,您应该从productList
数组中获取值:
for (int i = 0; i < productList.length; ++i) {
writer.format(productList[i].name, (productList[i].price + 100.0), (productList[i].number - 1), "\n");
}
答案 1 :(得分:0)
writer.format(name, (price + 100.0), (number - 1), "\n");
的参数不正确。由于它给出了NullPointerException。 阅读Java文档以了解应该传递的正确参数。
做这样的事情:
public String str=null; //declare class variable str.
在printContents()方法中,将以下内容分配给字符串:
str = "\n"+productName +" "+ (productPrice + 100.0)+" "+ (productAmount - 1)+"\n";
然后是finally方法,更改传递给writer.format()方法的参数,如下所示:
Formatter writer = new Formatter(new FileOutputStream("Product List.txt", true));
for (int i = 0; i < productList.length; ++i) {
writer.format(str);
}
这对我有用。 您想要的值正确地附加在文件&#34; ProductList.txt&#34;。
中