简体   繁体   English

ArrayList超出界限异常? PayRoll类别

[英]ArrayList out of Bounds Exception? PayRoll Class

I have a project in my programming class that has to give a PayRoll scenario which contains three classes including PayRoll, PayRollTester, and EmployeeRecord. 我的编程类中有一个项目,必须提供一个PayRoll方案,其中包含三个类,包括PayRoll,PayRollTester和EmployeeRecord。 My code compiles and prints the EmployeeRecord correctly but does not list the PayRoll correctly. 我的代码正确编译并打印EmployeeRecord,但未正确列出PayRoll。 Instead, I receive an error saying Error: Out of Bounds of ArrayList. 而是,我收到一条错误消息,提示错误:超出ArrayList的界限。

Payroll: 工资:

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: 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: PayrollTester:

import java.util.Scanner;

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

ArrayList index starts from 0. since your for loop start i = 0, you cannot do (i+1) in accessing arrayList elements. ArrayList索引从0开始。由于您的for循环起始i = 0,因此您无法在访问arrayList元素时执行(i + 1)。

emID.get(i + 1)

and also the size of emID is always 0 because you have just create new Arraylist but not added any objects to that list. 并且emID的大小始终为0,因为您刚刚创建了新的Arraylist,但未向该列表添加任何对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM