Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数字格式异常错误_Java_Numberformatexception - Fatal编程技术网

Java 数字格式异常错误

Java 数字格式异常错误,java,numberformatexception,Java,Numberformatexception,我是java新手,这个项目要求我存储输入文件中的员工信息,并将其打印出来。当我运行程序时,“java.lang.NumberFormatException:对于输入字符串:“Payroll”出现,我不知道如何更正它。输入txt文件是: Zywave Joe Payroll 10.00 RIM Fred Hardware 15.00 Zywave Sally Testing 20.00 RIM Jane Development 30

我是java新手,这个项目要求我存储输入文件中的员工信息,并将其打印出来。当我运行程序时,“java.lang.NumberFormatException:对于输入字符串:“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;
  }

}

问题在于您的输入文件

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+");
    ...
}

这表示有东西试图解析数字,但无法解析,因为输入字符串是
“Payroll”
,它显然不代表数字。解析数字的唯一方法是
Double.parseDouble
,因此这显然是罪魁祸首——堆栈跟踪验证了这一点

是否在
Zywave Joe Payroll 10.00
行中有一个非空白字符?一个空字符(
\u0000
)或类似的字符?输入中可能有一个前导空格


您可以使用
System.out.println(Arrays.toString(strings))
轻松检查这一点,问题似乎就在这里

strings=inputLine.split("\\s+");
这行中可能有一些额外的空白

Zywave      Joe  Payroll    10.00
导致
工资单
传递给

Double.parseDouble(strings[3])
因此,您没有按预期通过
10.00


尚未测试,但我认为您需要一个,它将捕获所有额外的空格,而不是在每个空格上拆分。它可能看起来如下:

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

您还可以查看单词边界上的拆分(
\b
,如果我没记错的话)。

从堆栈跟踪中,似乎
字符串[3]
包含单词
工资单
,而不是数字。这似乎很奇怪,因为
拆分
正则表达式看起来不错

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

  • 使用如下方式处理您正在阅读的行:
    inputline.trim()
    (拆分前),以便删除前导和尾随空格或
  • 因为数字总是在末尾,所以可以这样做:
    Double.parseDouble(string[string.length-1])

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

看起来你的文本中几乎有制表符和空格。你可能想更新你的正则表达式以反映这一点。

请发布stacktrace。我们没有超能力。请仔细检查并确保你发布的文本文件与输入文件相同。你的正则表达式似乎可以工作,否则。输入文件由我的教授提供,所以我无法更改。我只允许修改我的代码。听起来他给了我一个惊喜n这是给你的。我已经更新了我的答案来解决它。我用你的第一个选项来修复它,非常感谢!@Neved:不客气。我建议你在阅读文件时使用第一个选项,你可能永远都不知道用户可能会在其中抛出什么;)
...split("(\\s+)?");