Пустая строка в формате числа - PullRequest
0 голосов
/ 20 апреля 2009

Это мое назначение:

Вот мои вопросы:

  1. Как я могу исправить эту ошибку:

Исключение в потоке "main" java.lang.NumberFormatException: пустая строка at sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1012) at java.lang.Double.parseDouble (Double.java:527) at extracredit.Main.readData (Main.java:72) at extracredit.Main.main (Main.java:27)

  1. Есть ли другие проблемы, которые вы можете увидеть с этой программой?

Вот мой код:

    import java.io.*;
            import javax.swing.JOptionPane;
            import java.util.*;
            import java.util.StringTokenizer;

            public class Main {
     public static void main(String[] args) throws IOException {
     String fname = "data.txt"; //Read in the data file for use in the array
     String pass= JOptionPane.showInputDialog("Please enter the " +
             "password to continue:"); /*Have the user enter the password to 
     access the file. */

     checkPass(pass); // Verify that the password is correct before continuing.
     readData (fname); // Read data, print output and save output file.

  }


    private static void checkPass (String pass)
    {
     String password= "INF260";
     int passCount= 0;   
       if (pass.equals(password)) {
         System.out.println("The password is correct. Continuing...");
       }
       else {
        do {
           pass= JOptionPane.showInputDialog("Please re-enter the" +
                   "password:");
           passCount++;
        } while (!pass.equals(password) && passCount < 2);
           if (!pass.equals(password)) {
            System.out.println("You have tried to enter the " +
                   "password too many times. Exiting...");
            System.exit(0);
           }
           else {
               System.out.println("The password is correct. Continuing...");
           }
       }
    }
       public static void readData (String data) throws IOException{           
            FileReader inputData= new FileReader (data);
            BufferedReader findNum= new BufferedReader (inputData);
            String str= findNum.readLine ();

            int count=-1;
            int countNum= 0; 
            double total= 0;
            double min= 0;
            double max= 0;
            double average= 0;

            FileWriter writeFile = new FileWriter("sales.txt");
            PrintWriter printFile = new PrintWriter(writeFile);

            while (str != null)
             {
             double num= Double.parseDouble (str);
             if (count == 0){
               countNum++; // counter of Reciepts to use
              }
            str = findNum.readLine();
        }
           double [][] input = new double [countNum][10];
            total= getCurrentTotal(input); /*This will get the total 
             from the method getCurrentTotal.*/
            min= getCurrentMin(input); /*This will get the minimum value from
            the method getCurrentMin.*/
            max= getCurrentMax (input);  /*This will get the maximum value from
            the method getCurrentMax.*/

            average= (total / countNum);   //Calculate the average.     
            System.out.println("The List of Today's Sales:");
                for (int row = 0; row < input.length; row++){
                    System.out.println ();
                    System.out.println("Customer " + row + "\t");
                    for (int column = 0; column < input[row].length; column++){
                       if (input [row].length < 10){        
                        System.out.println(input[row][column] + "\t");
                        str = findNum.readLine();
                    }              
                    else{ 
                        System.out.println ("There are too many receipts" +
                                " for one Customer.\n");
                        System.exit (0);
                    }
                }

            }

    System.out.println ("There are " + countNum + "receipts in the list."); 
        /*This will print the total of receipts in the list.*/                      
    System.out.println ("The total of today's sales is $" + total); /*
        This will print the total of the sales for the day.*/
    System.out.println ("The average of today's sales is $" + average); /*  
        This will print the average sale total.*/
    System.out.println ("The highest receipt is $" + max); /* This will print 
         the highest sale.*/
    System.out.println ("The lowest receipt is $" + min); /* This will print 
        the lowest sale.*/
    Date date = new Date();
        System.out.println ("\n The current time is:" + date.toString()); /* This 
         will print the current date and time */

       }



    public static double getCurrentTotal (double [][] input){
        double totalAmount = 0;
        for (int row = 0; row < input.length; row++){
            for (int column = 0; column < input [row].length; column++){
                totalAmount += input [row][column];
            }
        }
        return totalAmount;    
    }

    public static double getCurrentMin (double [][] input) {    
        double currentMin = input[0][0]; 
        for (int row = 0; row < input.length; row++){
            for (int column = 0; column < input [row].length; column++){
                if (currentMin > input[row][column])
                    currentMin = input[row][column];
                }    
        }
        return currentMin;
    }

    public static double getCurrentMax (double [][] input){    
        double currentMax = input[0][0];
        for (int row = 0; row < input.length; row++){
            for (int column = 0; column < input [row].length; column++){
                if (currentMax < input[row][column]){
                    currentMax = input[row][column];
                }
            }    
        }
        return currentMax;
    }
}

Ответы [ 2 ]

3 голосов
/ 20 апреля 2009

Лучшее решение:

  • изучите материал курса
  • Начните с подмножества проблемы, например, просто чтения файла.
  • проверить это
  • цикл:
    • продолжать совершенствовать и улучшать программу, пока она не будет отвечать всем требованиям.
    • проверить это
  • вручите
1 голос
/ 20 апреля 2009
// from your main method
String fname = "data.txt";
readData (fname);

// the method being called
public static void readData (String data[][]){           
   BufferedReader br = new BufferedReader(new FileReader(data));

У нас здесь несовместимость.

  • fname - это строка
  • Метод принимает в качестве параметра String [].
  • конструктор newFileReader () принимает строку, а не двумерный массив.

Все эти три должны быть одного типа данных.

Как можно отделить каждую «квитанцию» от нуля (как показано на изображении выше)?

Тебе не обязательно. Вы должны ЧИТАТЬ из этого файла с нулями в нем.
Я бы порекомендовал вам написать метод примерно так:

public double [] readOneReceipt (читатель BufferedReader);

Этот метод должен

  • Читайте построчно, пока не встретится 0 записей
  • для каждой записи, которую она читает, преобразовать значение в число (double?)
  • Хранить номер во временной структуре.
  • Когда вы встретите «0», создайте новый массив правильного размера и скопируйте в него считанные значения.

Как я могу записать вывод в отдельный файл?

С java.io.FileWriter

Самым сложным в этом IMO является тот факт, что вам говорят хранить данные в 2-мерном массиве, но вы точно не знаете, какой размер создать массив, пока не прочитаете данные. Это означает, что вы либо используете временную динамическую структуру, либо читаете файл дважды - один раз, чтобы узнать, сколько существует квитанций, чтобы вы могли создать массив, а затем снова, чтобы фактически прочитать данные квитанции.

...