Java 数字格式异常错误
我是java新手,这个项目要求我存储输入文件中的员工信息,并将其打印出来。当我运行程序时,“java.lang.NumberFormatException:对于输入字符串:“Payroll”出现,我不知道如何更正它。输入txt文件是: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
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+)?");