我正在尝试通读文件并以不同的格式创建一些对象/打印信息。
我的大部分内容都是正确的,但由于某种原因,当它循环时我每次完成一个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
答案 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循环结束时只有一次。