1

我对 java 很陌生,并且一直在努力了解它。我一直在尝试编写概念验证员工数据库。一切正常,直到我输入最后一个员工条件,然后我得到一个 ArrayIndexOutOfBoundsException。这是我的两个文件的代码。任何帮助,将不胜感激。

import java.util.Scanner;
public class EmployeeInterface 
{
    public static void main(String[] args)
    {
        Scanner Input = new Scanner(System.in);

        System.out.println("Please enter the number of employees to register.");
        int employeeCount = Input.nextInt();
        Employee.setEmployeeNumber(employeeCount);
        String employeeFullName;
        String employeeAddress;
        String employeeDateOfHire;

        for(int x = 0; x <= employeeCount; x++)
        {
            System.out.println("Please enter the full name of employee number " + (x + 1));
            Input.nextLine();
            employeeFullName = Input.nextLine();
            System.out.println("Please enter the address of employee number " + (x + 1));
            employeeAddress = Input.nextLine();
            System.out.println("Please enter the date of hire for employee " + (x + 1));
            employeeDateOfHire = Input.nextLine();

            Employee.employeeRegister(x, employeeFullName, employeeAddress, employeeDateOfHire);
        }
    }
}

这是第二个文件:

public class Employee 
{
    private static int employeeCount;
    private static String employees[][] = new String[employeeCount][4];

    public static void setEmployeeNumber(int x)
    {
        employeeCount = x;
    }

    public static void employeeRegister(int employeeNumber, String employeeFullName, String address, String employeeHireDate)
    {
        employees[employeeNumber][0] = employeeFullName;
        employees[employeeNumber][1] = employeeFullName;
        employees[employeeNumber][2] = employeeFullName;
        employees[employeeNumber][3] = employeeFullName;
    }
}
4

5 回答 5

7

这就是问题:

for(int x = 0; x <= employeeCount; x++)

您正在使用<=而不是<. 因此,如果employeeCount是 3,您实际上会询问4名员工的详细信息,并使用索引 0、1、2 和 3 - 但对于大小为 3 的数组,3 是无效索引。

你的setEmployeeCount方法坏了——它改变了 的值employeeCount,但不会重新初始化数组,所以你总是会得到一个大小为 0 的数组。鉴于你已经说过代码在最后一个条目之前有效,我怀疑这在您的真实代码中不是问题,否则您会在第一个条目时遇到异常。

也就是说,我强烈建议您创建一个更有用的Employee类型,其中包含用于数字、名称等的私有实例字段......然后创建一个List<Employee>. (通过静态字段存储它可能没有任何意义Employee- 如果您想要两个员工列表怎么办?)

此外, anemployeeHireDate应该是某种适当的按时间顺序排列的类型 - 而不是字符串。(我建议使用LocalDateJoda Time,因为日期/时间类型的内置 Java 类型很糟糕。)

于 2013-08-18T18:05:54.130 回答
2

除了其他答案:

private static String employees[][] = new String[employeeCount][4];

employeeCount 立即初始化为 0,之后的数组也是如此。

您需要在设置employeeCount 后重新初始化您的数组。

于 2013-08-18T18:06:20.520 回答
0

您的循环正在重复 1 次额外的时间。如果employeeCount 为5,则循环迭代6 次。试试这个

for(int x = 0; x < employeeCount; x++)
于 2013-08-18T18:07:54.637 回答
0
ArrayIndexOutOfBounds Exception

<=因为您试图通过使用而不是<仅访问不存在的 1 个索引

利用for(int x = 0; x < employeeCount; x++)

代替

for(int x = 0; x <= employeeCount; x++)`
于 2013-08-18T18:08:24.707 回答
0

除了其他答案:

在该方法setEmployeeNumber(int x)中,您只需更改变量employeeCount。这里缺少的是调整存储员工的数组的大小:

employees[][] = new String[employeeCount][4];
于 2013-08-18T18:08:51.093 回答