从java中的文件读取时出现问题

时间:2013-11-20 04:29:15

标签: java string indexing

我正在尝试通读文件并以不同的格式创建一些对象/打印信息。

我的大部分内容都是正确的,但由于某种原因,当它循环时我每次完成一个if语句时会得到“String index out of range:0”(它会在它发生之前打印第一个对象)。

我已经对这个问题进行了一些研究,并且我认为它正在发生,因为下一行再次在0位寻找一个字符(ID.charAt(0))。但是,我有另一个程序,我已经这样做了,它的工作完美。有没有机会你们都可以看看它并告诉我在哪里搞砸了?

感谢您的帮助。我以前在这里问过几个问题你永远不会帮助我学习!

代码

import java.io.File;
import java.util.Scanner;
public class PayrollSystemTest2 {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Scanner input;
        input =  new Scanner(new File("EmployeePayrollInfo.txt"));
        Employee[] Emp = new Employee[20];

        while(input.hasNext())
        {
            String ID = input.nextLine();

            if (ID.charAt(0) == 'S')
            {
                String first = input.nextLine();
                String last = input.nextLine();
                String ssn = input.nextLine();
                Date DayOfBirth = new Date(input.nextInt(),input.nextInt(),input.nextInt());
                double salary = input.nextDouble();
                Emp[0] = new SalariedEmployee(first, last, ssn, DayOfBirth, ID, salary);
                System.out.println(Emp[0].toString());
            }
            else if (ID.charAt(0) == 'H')
            {
                String first = input.nextLine();
                String last = input.nextLine();
                String ssn = input.nextLine();
                Date DayOfBirth = new Date(input.nextInt(),input.nextInt(),input.nextInt());
                double hourlyWage = input.nextDouble();
                double hoursWorked = input.nextDouble();
                Emp[1] = new HourlyEmployee(first,last,ssn,DayOfBirth,ID,hourlyWage,hoursWorked);
                System.out.println(Emp[1].toString());
            }
            else if (ID.charAt(0) == 'C')
            {
                String first = input.nextLine();
                String last = input.nextLine();
                String ssn = input.nextLine();
                Date DayOfBirth = new Date(input.nextInt(),input.nextInt(),input.nextInt());
                Double sales = input.nextDouble();
                Double rate = input.nextDouble();
                Emp[2] = new CommissionEmployee(first,last,ssn,DayOfBirth,ID,sales,rate);
                System.out.println(Emp[2].toString());
            }
            else if (ID.charAt(0) == 'B')
            {
                String first = input.nextLine();
                String last = input.nextLine();
                String ssn = input.nextLine();
                Date DayOfBirth = new Date(input.nextInt(),input.nextInt(),input.nextInt());
                Double sales = input.nextDouble();
                Double rate = input.nextDouble();
                Double salary = input.nextDouble();
                Emp[3] = new BasePlusCommissionEmployee(first,last,ssn,DayOfBirth,ID,sales,rate,salary);
                System.out.println(Emp[3].toString());
            }
            else if (ID.charAt(0) == 'P')
            {
                String first = input.nextLine();
                String last = input.nextLine();
                String ssn = input.nextLine();
                Date DayOfBirth = new Date(input.nextInt(),input.nextInt(),input.nextInt());
                Double Wage = input.nextDouble();
                Double Pieces = input.nextDouble();
                Emp[4] = new PieceWorker(first,last,ssn,DayOfBirth,ID,Wage,Pieces);
                System.out.println(Emp[4].toString());
            }

        }
        input.close();


    }
}

文件我试图从

中读取
S100
Sully
Ross
111-11-1111
8 15 1979
900.00
H205
Joe
Aggie
222-22-2222
3 6 1993
15.25
40
C102
Rev
Elee
333-33-3333
11 22 1985
20000
.065
B115
Johnny
Football
444-44-4444
06 28 1965
12000
.05
400
P206
Miss
Bizbee
555-55-5555
11 06 1977
1.25
1000
X

3 个答案:

答案 0 :(得分:3)

这适用于你所有的块,但基本上当你这样做...

double salary = input.nextDouble();

它将新行字符留在扫描仪中,所以当你执行下一个String ID = input.nextLine();时,它正在读取该行的剩余部分,这基本上是空白的......

尝试在每个部分的末尾添加input.nextLine();,例如......

double salary = input.nextDouble();
input.nextLine();

此外,您的DayOfBirth错了。除了被弃用之外,Date构造函数还需要year, month, day中的值;)

答案 1 :(得分:0)

输入的第一行可能没有内容,只是作为一个空行(换行符)。尝试在第一个if语句之前打印出ID变量,看看你最终得到了什么。

答案 2 :(得分:0)

我的理由与 MadProgrammer 相似,但我们可以添加

,而不是在每个部分的末尾添加input.nextLine();
  

如果(input.hasNext()){

input.nextLine(); 
     

}

在while循环结束时只有一次。