简体   繁体   中英

PrintWriter creates file but doesn't print to file

This is a college course assignment that consists of classes TotalSales and TotalSalesTest.In the main program I have created a two dimensional array to output a columnar layout with cross-totals in 4 rows and 5 columns. This program outputs sales totals by row for each sales person(1 - 4) and output by column for products(1 - 5). I have created extra elements in the array to store total for rows and columns. So far both classes compiles. The problem is that although the PrintWriter creates a notepad file, it doesn't print to it. I could use some help on this problem. Here is the code`

 //write program in a two diminsional array to output a columnar layout with cross-totals in 4 rows and 5 columns
 //program outputs sales totals by row for each sales person(1 - 4) and output by column for products(1 - 5)
 //create extra elements to store total for rows and columns 
 import java.util.Scanner;
 import java.io.*;
 public class TotalSales
 {
 private int salesPerson; //declare class variable  
 private int productNumber;//declare class variable
 private double totalSales;//declare class variable
 private double allSales;
//declare input and output variables
Scanner inFile; //declare inFile variable 
PrintWriter outFile;//declare outFile variable 



  double[][]sales = new double[6][7];//declare array sales


  public void initializer()
  {
  try
  {
  inFile  = new Scanner( new File( "assign06.txt" ) );
  outFile = new PrintWriter( "MonthlyTotalSales.txt" );
  outFile.flush(); 
  }
  catch (FileNotFoundException e)
  {
     System.out.println("The input file could not be found!");
     System.exit(1); 
  }

 while(inFile.hasNext()) //while there is data to process… 
  {
 salesPerson = inFile.nextInt();//reads salesPerson
 productNumber = inFile.nextInt();//reads productNumber
 totalSales = inFile.nextDouble();//reads totalSales
 sales[salesPerson][productNumber]+=totalSales;

 sales[salesPerson][6]+=totalSales;

 sales[5][productNumber]+=totalSales;

 allSales += totalSales;
  } //end while loop
 printDetails(sales);//call method printDetails
 finishUp();//call method finishUp

 }//end initializer

 public void printDetails(double[][] array)
 {
outFile.println("\t1\t2\t3\t4\t5");

 for (int salesPerson =1; salesPerson <5; salesPerson++)
{
  outFile.print(salesPerson+ "      ");
  for(int productNumber=1; productNumber <=array.length; productNumber++)
     outFile.print(array[salesPerson][productNumber]+"    ");

  //end inside loop
  outFile.println();
 }//end outside loop


 outFile.print("Total: \t  ");
 for(int salesTotal=1; salesTotal<array.length; salesTotal++)
 {   
  outFile.print(array[5][salesTotal] +" ");
 }
 outFile.print(allSales);


 outFile.println();


    outFile.print("  ");        

    outFile.println();

  }//end printDetails

 public void finishUp()
 {
 inFile.close();
 outFile.close();
 System.out.println("The program has finished.");

 }//end finishUp

}//end class TotalSales

Here is the test program:

public class TotalSalesTest
{
    public static void main(String[] args)
    {
        TotalSales ts = new TotalSales();
        ts.initializer();
    }//end method main
}

Here is the text file for the input:

1 1 37.50
1 2 77.00
1 3 68.75
1 4 61.25
1 5 175.00
2 1 45.00
2 2 66.00
2 3 27.50
2 4 49.00
2 5 250.00
3 1 67.50
3 2 33.00
3 4 73.50
3 5 200.00
4 1 15.00
4 2 99.00
4 3 123.75
4 4 85.75
4 5 125.00
1 1 60.00
1 2 88.00
1 3 41.25
1 4 49.00
1 5 225.00
2 1 67.50
2 2 33.00
2 3 27.50
2 4 122.50
2 5 25.00
3 1 60.00
3 2 44.00
3 3 96.25
3 4 36.75
3 5 50.00
4 1 75.00
4 2 11.00
4 3 41.25
4 4 98.00
4 5 125.00
1 1 45.00
1 2 33.00
1 3 27.50
1 4 61.25
1 5 200.00
2 1 52.50
2 2 22.00
2 3 13.75
2 4 36.75
2 5 50.00
3 1 37.50
3 2 88.00
3 3 96.25
3 4 36.75
4 1 37.50
4 2 77.00
4 3 82.50
4 4 73.50
4 5 25.00
1 1 30.00
1 2 88.00
1 3 41.25
1 4 12.25
1 5 175.00
2 1 45.00
2 2 22.00
2 3 68.75
2 4 98.00
3 2 88.00
3 3 41.25
3 4 24.50
4 1 30.00
4 2 88.00
4 3 82.50
4 4 122.50
4 5 175.00

You call printDetails before initializing the writer... Move the printDetails call after outFile = new PrintWriter( "MonthlyTotalSales.txt" ); and it should be fine. However, you should have included your constructor since as it is right now, I would think your code throws a NullPointerException because the writer is never initialized. You also need to close the file before writing in it, or at least you need to flush.

The whole structure of your code is bad, you should never have a method such as mainProgram on a class, you should never use a file as an attribute just to use it in every method, and you should never separate in different methods creation and closing of i/o classes.

It seems you didn't call outFile.close();

Call your finishUp() method once you complete writing in the file.

I think your program crashes with a nullpointer on

inFile.hasNext()

because you never actually opened or even instantiated the input file along with the output file in the try/catch block. Whoops!

change

    try
    {
        outFile = new PrintWriter( "MonthlyTotalSales.txt" ); 
    }

to

    try
    {
        inFile = new Scanner(new File("Input.txt"));
        outFile = new PrintWriter( "MonthlyTotalSales.txt" ); 
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM