1

我是java新手,这个项目要求我从输入文件中存储员工的信息,然后打印出来。当我运行程序时,出现“java.lang.NumberFormatException: For input string:”Payroll”,我不知道如何更正。输入的txt文件是:

  Zywave        Joe  Payroll    10.00
  RIM     Fred    Hardware  15.00
    Zywave Sally Testing    20.00
  RIM Jane  Development 30.00
 Apple  Steve  Design    1000.00

谢谢你的帮助!

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class A2Q1
{
 public static void main(String[] parms)
 {
  process();

  System.out.println("\nProgram completed normally.");
 }

 public static void process()
 {
  Employee[] employees;

  employees = loadEmployees();
  printEmployees(employees);

 }

 public static Employee[] loadEmployees()
 {
   BufferedReader fileIn;
   Employee[] employees;
   Employee[] newemployees;
   String inputLine;
   int count;
   String [] strings;

   count=0;
   newemployees = new Employee[50];
   try
   {
     fileIn = new BufferedReader(new FileReader("A2Q1in.txt"));
     inputLine = fileIn.readLine();
     while (inputLine != null)
     {
       strings=inputLine.split("\\s+");
       newemployees[count]=new Employee(strings[0],strings[1],strings[2],Double.parseDouble(strings[3]));
       count++;
       inputLine = fileIn.readLine();
     }
     fileIn.close();
   }
   catch (IOException ioe)
   {
     System.out.println(ioe.getMessage());
   }
   if (count>0)
   {
     employees = new Employee[count];
     System.arraycopy(newemployees,0,employees,0,count);
   }
   else
   {
     employees= new Employee[0];
   }
   return employees;
 }
 public static void printEmployees(Employee[] employees)
 {
   int i;
   for (i=0;i<employees.length;i++)
   {
     System.out.println(employees[i]);
   }
 }
}

/*********************************************************************/
/*********************************************************************/

class Employee
{
  private String group;
  private String company;
  private double wage;
  private String name;

  public Employee(String scompany, String sname, String sgroup, double swage)
 {
  company=scompany;
  name = sname;
  group = sgroup;
  wage=swage;
 }

  public String toString()
  {
    return company +" " +name +" " +group+" "+wage;
  }

}

这是错误消息:

 run A2Q1
 java.lang.NumberFormatException: For input string: "Payroll"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at A2Q1.loadEmployees(A2Q1.java:41)
    at A2Q1.process(A2Q1.java:18)
    at A2Q1.main(A2Q1.java:9)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
> 
4

5 回答 5

0

问题在于您的输入文件

Zywave      Joe  Payroll    10.00
RIM     Fred    Hardware    15.00
Zywave Sally Testing    20.00 // Remove the extra space at the start of this line
RIM Jane   Development 30.00 // Remove the extra space at the start of this line
Apple  Steve  Design    1000.00

由于行首的空格,拆分数组中的第一个元素是一个空白字符串,而数组中的第四个元素(应该是一个数值)恰好是一个字符串。当试图将此字符串解析为双精度时,它会给出NumberFormatException.

编辑:-由于您无法编辑文件,您可以使用trim()来帮助您。

while (inputLine != null) {
    inputLine = inputLine.trim(); // This will remove the leading and trailing spaces for you. Job done.
    strings = inputLine.split("\\s+");
    ...
}
于 2013-10-17T05:02:57.510 回答
0

这表明有东西试图解析一个数字,但它不能,因为输入字符串是"Payroll",它显然不代表一个数字。您使用的唯一解析数字的方法是Double.parseDouble,所以这显然是罪魁祸首——您的堆栈跟踪验证了这一点。

可能是该行中有一个非空白字符Zywave Joe Payroll 10.00吗?空字符 ( \u0000) 之类的?也许输入中的领先空间?

您可以使用 轻松检查System.out.println(Arrays.toString(strings))

于 2013-10-17T05:04:06.023 回答
0

看起来问题就在这里

strings=inputLine.split("\\s+");

您可能在此行中有一些额外的空白

Zywave      Joe  Payroll    10.00

导致Payroll被传递给

Double.parseDouble(strings[3])

所以你没有10.00按预期通过。


尚未测试,但我认为您需要一个非贪婪的正则表达式,它将捕获所有额外的空格,而不是在每个空格上拆分。它可能看起来像这样:

...split("(\\s+)?");

您还可以考虑在单词边界上进行拆分(\b如果我没记错的话)。

于 2013-10-17T05:04:42.953 回答
0

从堆栈跟踪来看,似乎strings[3]包含单词Payroll而不是数字。这似乎很奇怪,因为您的split正则表达式看起来不错。

我看到的唯一问题是输入文件的格式和布局,因为您似乎在文本之前也有额外的空格。你可以做的是:

  • 处理您正在阅读的行,如下所示inputline.trim():(在拆分之前)以便删除前导和尾随空格或
  • 由于数字总是在最后,你可以这样做:Double.parseDouble(string[string.length - 1])

就我个人而言,我会选择第一个选项,因为它应该让您 100% 确定您正在阅读的文本中唯一的空白位于您想要处理的值之间,这本质上是您的代码已经存在的假设继续运行。

于 2013-10-17T05:04:43.937 回答
0

看起来你在那里几乎有制表符和空格。可能想要更新您的正则表达式以反映这一点。

于 2013-10-17T05:06:48.690 回答