Ошибка NumberFormatException

Я новичок в java, и этот проект просит меня сохранить информацию о сотрудниках из входных файлов и распечатать ее. Когда я запускаю программу, появляется «java.lang.NumberFormatException: для входной строки:« Заработная плата », я не знаю, как это исправить. Входной текстовый файл:

  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)
> 

person Neved    schedule 17.10.2013    source источник
comment
Пожалуйста, опубликуйте трассировку стека. У нас нет сверхспособностей.   -  person user2339071    schedule 17.10.2013
comment
Дважды проверьте и убедитесь, что текстовый файл, который вы разместили, идентичен вашему входному файлу. Кажется, ваше регулярное выражение будет работать иначе.   -  person yamafontes    schedule 17.10.2013


Ответы (5)


Судя по трассировке стека, strings[3] содержит слово Payroll вместо числа. Это кажется странным, поскольку ваше регулярное выражение split выглядит нормально.

Единственная проблема, которую я вижу, это форматирование и расположение входного файла, так как может показаться, что у вас также есть лишние пробелы перед текстом. Что вы могли бы сделать, так это:

  • Обработайте строку, которую вы читаете, примерно так: inputline.trim() (перед разделением), чтобы удалить начальные и конечные пробелы ИЛИ
  • Так как число всегда будет в конце, вы можете сделать это: Double.parseDouble(string[string.length - 1])

Лично я бы выбрал первый вариант, поскольку он должен дать вам 100% уверенность в том, что единственное пустое пространство, которое у вас есть в тексте, который вы читаете, находится между значениями, которые вы хотели бы обработать, что, по сути, является предположением, которое ваш код уже работает на.

person npinti    schedule 17.10.2013
comment
Я исправил это с вашим первым вариантом, большое спасибо! - person Neved; 17.10.2013
comment
@Невед: Добро пожаловать. Я бы рекомендовал использовать первый вариант всякий раз, когда вы читаете из файла, вы никогда не узнаете, что пользователь может добавить туда;) - person npinti; 17.10.2013

Это указывает на то, что что-то пыталось проанализировать число, но не смогло, потому что входная строка была "Payroll", что, очевидно, не представляет число. Единственный метод, который вы используете, который анализирует числа, — это Double.parseDouble, так что очевидно, что это виновник — ваша трассировка стека подтверждает это.

Может ли быть, что в строке Zywave Joe Payroll 10.00 есть непробельный символ? Нулевой символ (\u0000) или что-то подобное? Может быть, начальный пробел во входных данных?

Вы можете легко проверить это с помощью System.out.println(Arrays.toString(strings)).

person yshavit    schedule 17.10.2013

Похоже, у вас там есть табуляции и пробелы. Возможно, вы захотите обновить регулярное выражение, чтобы отразить это.

person Jason McD    schedule 17.10.2013

Проблема с вашим входным файлом

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+");
    ...
}
person RainMaker    schedule 17.10.2013
comment
Входной файл предоставлен моим профом, поэтому я не могу его изменить. Мне разрешено только изменять мой код. - person Neved; 17.10.2013
comment
Похоже, он приготовил для тебя сюрприз. Я обновил свой ответ, чтобы решить эту проблему. - person Ben; 17.10.2013

Похоже проблема здесь

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

У вас могут быть лишние пробелы в этой строке

Zywave      Joe  Payroll    10.00

в результате чего Payroll будет передано

Double.parseDouble(strings[3])

так что вы не передаете 10.00, как вы ожидаете.


Еще не проверено, но я думаю, вам нужно нежадное регулярное выражение, который будет захватывать все лишние пробелы, а не разделять их по каждому. Вероятно, это выглядит так:

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

Вы также можете изучить разделение по границам слов (\b, если я правильно помню).

person Ben    schedule 17.10.2013