ArrayList超出Bounds异常? PayRoll等级

时间:2015-09-29 15:02:21

标签: java arraylist

我的编程课程中有一个项目必须提供PayRoll场景,其中包含三个类,包括PayRoll,PayRollTester和EmployeeRecord。我的代码正确编译并打印EmployeeRecord,但没有正确列出PayRoll。相反,我收到错误说错误:ArrayList超出界限。

薪资:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Date;

// ...javadoc...
public class Payroll
{
    //ArrayLists that will use methods from EmployeeRecords.
    ArrayList<String> employeeNames2;
    ArrayList<Double> employeeWages2;

    ArrayList<Integer> emID = new ArrayList<Integer>();
    ArrayList<Double> hours = new ArrayList<Double>();
    ArrayList<Double> totalPay = new ArrayList<Double>();
    //Creating the hours and wages variables.
    private double hoursWorked = 0.0;
    private double hoursWorked2 = 0.0;
    private int weeks = 0;
    private String employeeID = "%03d";
    private int quit = 1000;
    private int i = 1;

    Scanner input = new Scanner(System.in);

    public void setEmployeePayroll()
    {
        // Constructs a new EmployeeRecord.
        EmployeeRecord e = new EmployeeRecord();
        e.setEmployeeInfo();

        employeeNames2 = e.getEmployeeNamesArrayList();
        employeeWages2 = e.getWageArrayList();

        // Local variables used in setEmployeePayroll.
        double totalPay2 = 0.0;
        double totalHours = 0.0;
        double overTime = 0.0;
        double overTime2 = 0.0;

        System.out.println("Please enter ACME employee ID, the week they worked (1 or 2), and the number of hours worked. This information should be entered in the order the names were entered. Enter 0 when you are done inputing information.");

        while(quit != 0)
        {
            quit = input.nextInt();
            if(quit == 0)
            {
                break;
            }

            weeks = input.nextInt();

            if(weeks == 1)
            {
                hoursWorked = input.nextDouble();
            }
            else if(weeks == 2)
            {
                hoursWorked2 = input.nextDouble();
            }

            /*
             * I am checking to see if the employee is going to be paid for overtime and also calculating the pay for both weeks.
             * 1) My first if statement indicates whether or not the employee worked over 40 in week one and week two.
             * 2) My first else if statement indicates whether the employee works more than 40 hours in week two but not week one.
             * 3) My second else if statement indicates whether the employee works more than 40 hours in week one but not in week two.
             * 3) My third else if statement finally indicates that the employee worked over 40 hours in both week one and two.
             */
            if(hoursWorked > 0 && hoursWorked <= 40 && hoursWorked2 > 0 && hoursWorked2 <= 40)
            {
                totalHours = hoursWorked + hoursWorked2;
                hours.add(totalHours);
                totalPay2 = totalHours * (employeeWages2.get(i - 1));
                totalPay.add(totalPay2);
                hoursWorked = 0.0;
                hoursWorked2 = 0.0;
            }
            else if(hoursWorked2 > 40 && hoursWorked > 0 && hoursWorked <= 40)
            {
                overTime2 = hoursWorked2 - 40;
                totalHours = hoursWorked + hoursWorked2;
                hours.add(totalHours);
                totalPay2 = totalHours * (employeeWages2.get(i - 1)) + (overTime2 * 1.5);
                totalPay.add(totalPay2);
                hoursWorked = 0.0;
                hoursWorked2 = 0.0;
            }
            else if(hoursWorked > 40 && hoursWorked2 <= 40 && hoursWorked2 > 0)
            {
                overTime = hoursWorked - 40;
                totalHours = hoursWorked + hoursWorked2;
                hours.add(totalHours);
                totalPay2 = totalHours * (employeeWages2.get(i - 1)) + (overTime * 1.5);
                totalPay.add(totalPay2);
                hoursWorked = 0.0;
                hoursWorked2 = 0.0;
            }
            else if(hoursWorked > 40 && hoursWorked2 > 40)
            {
                overTime = hoursWorked - 40;
                overTime2 = hoursWorked2 - 40;
                totalHours = hoursWorked + hoursWorked2;
                hours.add(totalHours);
                totalPay2 = totalHours * (employeeWages2.get(i - 1)) + (1.5 * (overTime + overTime2));
                totalPay.add(totalPay2);
                hoursWorked = 0.0;
                hoursWorked2 = 0.0;
            }
            i = quit;
        }
        System.out.println();
        System.out.println("Employee Number  |  Employee Name    |  Hours Worked  |  Total Pay");
        for(int i = 0; i < e.getEmployeeNamesArrayList().size();)
        {
            System.out.println(String.format(employeeID, i + 1) + "              | " + emID.get(i + 1) + "        | " + hours.get(i + 1) + "           | " + totalPay.get(i + 1));
        }
    }
}

EmployeeRecord:

import java.util.Scanner;
import java.util.ArrayList;

// ...javadoc...
public class EmployeeRecord
{
    /*
     * Creating the array and instance variables for EmployeeRecord consisting
     * of TaxID numbers, Employee Names, Wages, Employee ID numbers and hours worked.
     */
    ArrayList<String> employeeNames = new ArrayList<String>();
    ArrayList<String> taxIDList = new ArrayList<String>();
    ArrayList<Double> employeeWages = new ArrayList<Double>();

    Scanner input = new Scanner(System.in);

    private String employeeID = "%03d";
    private String employeeFullName = " ";
    private String taxID = " ";
    private double wage = 0.0;

    //Adding employees.
    public void setEmployeeInfo()
    {
        System.out.println("Please enter the full names of each ACME employee, their employee tax ID, and their employee wage rate. Type 'Q Q' when you are done entering employee information.");

        while(employeeFullName != "Q")
        {
            employeeFullName = input.next() + " " + input.next();
            if(employeeFullName.equalsIgnoreCase("Q" + " " + "Q"))
            {
            break;
            }
            taxID = input.next();
            wage = input.nextDouble();

            employeeNames.add(employeeFullName);
            taxIDList.add(taxID);
            employeeWages.add(wage);

            System.out.println("Employee ID  |  Employee Name        |  Tax ID          |  Wage");
            for(int i = 1; i <= employeeNames.size(); i++)
            {
                System.out.printf(String.format(employeeID, i) + "          | " + employeeNames.get(i - 1) + "              | " + taxIDList.get(i - 1) + "          | " + "%1.2f",employeeWages.get(i - 1));
                System.out.println();
            }
        }
    }

    /**
     * Creating a method that returns the employee ArrayList employeeName.
     */
    public ArrayList<String> getEmployeeNamesArrayList()
    {
        return employeeNames;
    }

    /**
     * Creating a method that returns the employee's Tax ID ArrayList taxIDList.
     */
    public ArrayList<String> getTaxIdsArrayList()
    {
        return taxIDList;
    }

    /**
     * Creating a method that returns the wages ArrayList 
     */
    public ArrayList<Double> getWageArrayList()
    {
        return employeeWages;
    }

}

PayrollTester:

import java.util.Scanner;

// ...javadoc...
public class PayrollTester
{
    public static void main(String[] args)
    {
        Payroll employeeComplete = new Payroll();
        employeeComplete.setEmployeePayroll();
    }
}

1 个答案:

答案 0 :(得分:0)

ArrayList索引从0开始,因为你的for循环开始i = 0,你不能在访问arrayList元素时做(i + 1)。

emID.get(i + 1)

并且emID的大小始终为0,因为您刚刚创建了新的Arraylist但未向该列表添加任何对象。