数字格式中的空字符串

时间:2009-04-20 01:58:46

标签: java arrays file-io casting

This是我的任务:

以下是我的问题:

  1. 如何解决此错误:
  2.   

    线程“main”中的异常java.lang.NumberFormatException:empty String           at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1012)           在java.lang.Double.parseDouble(Double.java:527)           在extracredit.Main.readData(Main.java:72)           在extracredit.Main.main(Main.java:27)

    1. 使用此程序可以看到其他任何问题吗?
    2. 到目前为止,这是我的代码:

          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 个答案:

答案 0 :(得分:3)

最佳解决方案是:

  • 学习您的课程材料
  • 从问题的一个子集开始,比如只读取文件。
  • 测试
  • 循环:
    • 继续改进和加强该计划,直至满足所有要求。
    • 测试
  • 交上

答案 1 :(得分:1)

// 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 reader);

此方法

  • 逐行阅读,直到遇到0条目
  • 对于它读取的每个条目,将值转换为数字(double?)
  • 将号码存储在临时结构中。
  • 遇到“0”时,创建一个大小正确的新数组并将读取值复制到其中。
  

如何将输出写入单独的文件?

使用java.io.FileWriter

这个IMO中最困难的事实是你被告知要将数据存储在一个二维数组中,但是在你读取数据之前你没有确切的数量。 这意味着您要么使用临时动态结构,要么读取文件两次 - 一次查找有多少收据以便您可以制作数组,然后再次实际读取收据数据。