0

Для этой программы я пытаюсь настроить фонд заработной платы для введенных сотрудников. В программе пользователь вводит имя сотрудника, идентификатор налога и заработную плату и автоматически генерирует идентификационный номер для каждого введенного сотрудника. После ввода этой информации пользователю предлагается указать количество отработанных часов в течение 2 недель. Для этого вводится идентификационный номер сотрудника для указания сотрудника, который работал определенное количество часов. Затем вводится либо неделя 1, либо 2, чтобы определить, на какой неделе они работали. Наконец, количество часов, отработанных на этой неделе, введено. Как только информация будет завершена, пользователь войдет в 0, чтобы прекратить вводить данные, а платежная ведомость печатается на диаграмме. Основная проблема, с которой я сталкиваюсь, заключается в том, что вы ДОЛЖНЫ ввести идентификатор, неделю и часы для КАЖДОГО сотрудника, добавленного в список, независимо от того, работали они или нет в течение 2-недельного периода. Я хочу попытаться выяснить, как установить число рабочих часов и общее количество выплат в 0, если я не введу какую-либо информацию для определенного сотрудника. Например, если я введу: 1, для сотрудника 1; 1, за 1 неделю; 20, по часам работы в неделю 1; нажмите Ввод; 1, снова для сотрудника 1; 2, на вторую неделю; и 30 часов, отработанных в неделю 2, эта информация будет напечатана в таблице. Скажем, у меня есть другой сотрудник, сотрудник 2. Я не хочу вводить всю эту информацию для сотрудника 2, если они не работали вообще на первой или второй неделе, поэтому таблица должна печатать 0 для часов работы и 0 для общей оплаты если я не буду вводить идентификатор, номер недели и часы работы. Вместо этого, однако, это дает мне outOfBoundsException: Index: 1 Size: 1 Ошибка при попытке сделать это. Мне было интересно, есть ли у кого-нибудь решение. Ниже перечислены 3 класса моего кода. Пример выполненной программы с outOfBoundsException указан в основном классе.Программа расчета заработной платы на Java, общая сумма заработной платы и общая сумма выплат

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

/** 
* A class that contains methods for prompting a user for ACME employee information including names, tax IDs, and wages. 
*/ 
public class EmployeeRecord 
{ 
    // ArrayLists used in methods. 
    ArrayList<String> employees = new ArrayList<String>(); 
    ArrayList<String> tIds = new ArrayList<String>(); 
    ArrayList<Double> wages = new ArrayList<Double>(); 
    ArrayList<String> employeesLast = new ArrayList<String>(); 

    Scanner in = new Scanner(System.in); 

    // Private Instance variables used in methods. 
    private String employeeId = "%03d"; 
    private String employeeName = " "; 
    private String employeeNameLast = " "; 
    private String taxId = " "; 
    private double wage = 0.0; 

    /** 
    * A method that prompts the user to enter ACME employee names, tax IDs, and wages. This method also generates an ID number for each employee. 
    */ 
    public void setEmployeeInfo() 
    { 
     System.out.println("Please enter the names of each ACME employee, each employee tax ID, and each employee wage rate. Press Q when you are done entering names."); 

     while(!employeeName.equalsIgnoreCase("Q")) 
     { 
       employeeName = in.next(); 
       if(employeeName.equalsIgnoreCase("Q")) 
       { 
       break; 
       } 
       employeeNameLast = in.next(); 
       taxId = in.next(); 
       wage = in.nextDouble(); 

       employees.add(employeeName); 
       employeesLast.add(employeeNameLast); 
       tIds.add(taxId); 
       wages.add(wage); 

       System.out.println("Employee ID | Employee Name  | Tax ID   | Wage"); 
       for(int i = 1; i <= employees.size(); i++) 
       { 
        System.out.printf(String.format(employeeId, i) + "   | " + employees.get(i - 1) + " " + employeesLast.get(i - 1) + "    | " + tIds.get(i - 1) + "   | " + "%1.2f",wages.get(i - 1)); 
        System.out.println(); 
       } 
     } 
    } 

    /** 
    * A method that gets the list of ACME employee first names added to the record. 
    * @return 
    * Returns the ArrayList containing the first names of each employee entered. 
    */ 
    public ArrayList<String> getEmployeeArrayList() 
    { 
     return employees; 
    } 

    /** 
    * A method that gets the list of ACME employee last names added to the record. 
    * @return 
    * Returns the ArrayList containing the last names of each employee entered. 
    */ 
    public ArrayList<String> getEmployeeLastArrayList() 
    { 
     return employeesLast; 
    } 

    /** 
    * A method that gets the list of ACME employee tax IDs added to the record. 
    * @return 
    * Returns the ArrayList containing the tax IDs of each tax ID entered. 
    */ 
    public ArrayList<String> getTaxIdsArrayList() 
    { 
     return tIds; 
    } 

    /** 
    * A method that gets the list of ACME employee wages added to the record. 
    * @return 
    * Returns the ArrayList containing the wages of each wage entered. 
    */ 
    public ArrayList<Double> getWageArrayList() 
    { 
     return wages; 
    } 

} 

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Date; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 

/** 
* A class that contains methods for entering payroll information for each ACME employee. This class uses methods from the EmployeeRecord class in order to run and therefore, relies on the EmployeeRecord class to operate. 
*/ 
public class Employee 
{ 
    // ArrayLists that will implement return methods from the EmployeeRecord class. 
    ArrayList<String> eMp; 
    ArrayList<String> eMpL; 
    ArrayList<Double> eW; 

    // ArrayLists used to store values in setEmployeePayroll() method. 
    ArrayList<Integer> eId = new ArrayList<Integer>(); 
    ArrayList<Double> hours = new ArrayList<Double>(); 
    ArrayList<Double> tPay = new ArrayList<Double>(); 

    // Instance Variables used in setEmployeePayroll() method. 
    private String employeeId = "%03d"; 
    private int weekNumber = 0; 
    private double hoursWorked = 0.0; 
    private double hoursWorked2 = 0.0; 
    private int terminate = 1000; 
    private int i = 0; 


    Scanner in = new Scanner(System.in); 

    /** 
    * A method that implements the EmployeeRecord class to prompt the user to enter information for the payroll of each ACME employee. The payroll for each employee is then displayed. 
    */ 
    public void setEmployeePayroll() 
    { 
     // Constructs a new EmployeeRecord to implement classes from EmployeeRecord class. 
     EmployeeRecord e = new EmployeeRecord(); 
     e.setEmployeeInfo(); 

     eMp = e.getEmployeeArrayList(); 
     eMpL = e.getEmployeeLastArrayList(); 
     eW = e.getWageArrayList(); 

     // Local variables used in this method. 
     double totalPay = 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(terminate != 0) 
     { 
      terminate = in.nextInt(); 
      if(terminate == 0) 
      { 
       break; 
      } 

      weekNumber = in.nextInt(); 

      if(weekNumber == 1) 
      { 
       hoursWorked = in.nextDouble(); 
      } 
      else if(weekNumber == 2) 
      { 
       hoursWorked2 = in.nextDouble(); 
      } 

      // Checks to see if an employee receives a 150% bonus on their payroll. 
      if(hoursWorked > 0 && hoursWorked <= 40 && hoursWorked2 > 0 && hoursWorked2 <= 40) 
      { 
       totalHours = hoursWorked + hoursWorked2; 
       hours.add(totalHours); 
       totalPay = totalHours * (eW.get(i - 1)); 
       tPay.add(totalPay); 
       hoursWorked = 0.0; 
       hoursWorked2 = 0.0; 
      } 
      else if(hoursWorked2 > 40 && hoursWorked > 0 && hoursWorked <= 40) 
      { 
       overTime2 = hoursWorked2 - 40; 
       totalHours = hoursWorked + hoursWorked2; 
       hours.add(totalHours); 
       totalPay = totalHours * (eW.get(i - 1)) + (overTime2 * 1.5); 
       tPay.add(totalPay); 
       hoursWorked = 0.0; 
       hoursWorked2 = 0.0; 
      } 
      else if(hoursWorked > 40 && hoursWorked2 <= 40 && hoursWorked2 > 0) 
      { 
       overTime = hoursWorked - 40; 
       totalHours = hoursWorked + hoursWorked2; 
       hours.add(totalHours); 
       totalPay = totalHours * (eW.get(i - 1)) + (overTime * 1.5); 
       tPay.add(totalPay); 
       hoursWorked = 0.0; 
       hoursWorked2 = 0.0; 
      } 
      else if(hoursWorked > 40 && hoursWorked2 > 40) 
      { 
       overTime = hoursWorked - 40; 
       overTime2 = hoursWorked2 - 40; 
       totalHours = hoursWorked + hoursWorked2; 
       hours.add(totalHours); 
       totalPay = totalHours * (eW.get(i - 1)) + (1.5 * (overTime + overTime2)); 
       tPay.add(totalPay); 
       hoursWorked = 0.0; 
       hoursWorked2 = 0.0; 
      } 

      i = terminate; 
     } 

     // Constructs a new date format for the date of the payroll. 
     DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Date d = new Date(); 

     // Gets current date and time for payroll. 
     System.out.println("ACME Payroll run on " + format.format(d)); 
     System.out.println(); 
     System.out.println("Employee Number | Employee Name | Hours Worked | Total Pay"); 
     for(int i = 1; i <= e.getEmployeeArrayList().size(); i++) 
     { 
      System.out.println(String.format(employeeId, i) + "    | " + eMp.get(i - 1) + " " + eMpL.get(i - 1) + "  | " + hours.get(i - 1) + "   | " + tPay.get(i - 1)); 
     } 
    } 
} 

/** 
* The main class that runs the contents of the EmployeeRecord and Employee classes. 
* 
* 
*/ 
public class runPayroll 
{ 
    public static void main(String[] args) 
    { 
     Employee eE = new Employee(); 
     eE.setEmployeePayroll(); 
    } 
} 
/** 
* Please enter the names of each ACME employee, each employee tax ID, and each employee wage rate. Press Q when you are done entering names. 
Jane Smith 1010101 10 
Employee ID | Employee Name  | Tax ID   | Wage 
001   | Jane Smith    | 1010101   | 10.00 
John Smith 1111111 10 
Employee ID | Employee Name  | Tax ID   | Wage 
001   | Jane Smith    | 1010101   | 10.00 
002   | John Smith    | 1111111   | 10.00 
q 
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. 
1 1 20 
1 2 30 
0 
ACME Payroll run on 2015/09/15 22:25:19 

Employee Number | Employee Name | Hours Worked | Total Pay 
Exception in thread "main" 001    | Jane Smith  | 50.0   | 500.0 
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
    at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
    at java.util.ArrayList.get(ArrayList.java:429) 
    at Employee.setEmployeePayroll(Employee.java:128) 
    at runPayroll.main(runPayroll.java:11) 

*/ 
+0

Что линия бросает исключение? Можете ли вы дать точный результат? Я также рекомендую прочитать рекомендации по [минимальным, полным и проверяемым примерам] (http://stackoverflow.com/help/mcve). –

+0

@ DanielM. Я обновил сообщение, чтобы включить образец программы в основной класс. Здесь отображается вывод. Исключение throw возникает в этой строке в классе Employee: – RunnerDude3000

+0

@ DanielM. System.out.println (String.format (employeeId, i) + "|" + eMp.get (i - 1) + "" + eMpL.get (i - 1) + "|" + hours.get (i - 1) + "|" + tPay.get (i - 1)); – RunnerDude3000

ответ

0

Проблема существует в нижней части класса Employee.

for(int i = 1; i <= e.getEmployeeArrayList().size(); i++) 
     { 
      System.out.println(String.format(employeeId, i) + "    | " + eMp.get(i - 1) + " " + eMpL.get(i - 1) + "  | " + hours.get(i - 1) + "   | " + tPay.get(i - 1)); 
     } 

ArrayList - это нулевой индекс.

Короче говоря, представьте, что вы должны были выложить все элементы списка, как большинство людей думают, список является:

1 2 3 4 5 6 7 8 9

То есть один-индексированный список. Нуль-индексированный список (типа, используемый в компьютерном программировании) выкладываются так:

0 1 2 3 4 5 6 7 8

Если вы хотите получить доступ к первому элементу, вы должны получить элемент в позиции 0. Если вы хотите чтобы получить 5-й элемент, вы должны получить элемент в позиции 4. Это немного назад, но так оно и было в течение многих лет, и это имеет смысл после некоторого времени со списком и массивами. По причинам, использующим нулевые индексы, см. here.

Что касается кода, вы пытаетесь получить доступ к нему, как один-индексированные список:

for(int i = 1; i <= e.getEmployeeArrayList().size(); i++)

Там только одна запись в списке, так это выглядит следующим образом:

0

Цикл for начинает итерацию. Он начинается с int i = 1.Незначительная проблема: в массиве нет индекса 1. Java не знает, что с ним делать, поэтому он взрывается. Для того, чтобы иметь дело с нулевой индексированной список, вы должны использовать

for(int i = 0; i < e.getEmployeeArrayList().size(); i++)

Смежные вопросы