此代码保持格式化文件而不是写入文件。我如何解决它?

时间:2015-11-26 11:26:39

标签: java arrays java-io formatter

我在这里声明了一个数组和变量。 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;
&#13;
&#13;

每次运行代码时,它都会保留格式化现有文件,然后报告NullPointerException。我完全迷失了如何解决这个问题,而我们的讲师从未涉及过它。请

  
    

productList []数组包含每个标识符中包含的名称,价格和数字值。我想擦除现有文件的内容,然后使用新值写入以更新数组中的内容

  

2 个答案:

答案 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是什么,基于它的名称以及你在迭代它的事实,也许你应该从该列表的元素中得到pricename

编辑:

根据代码的其余部分,您应该从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;。