gpt4 book ai didi

java.lang.ArrayIndexOutOfBoundsException?

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:18 25 4
gpt4 key购买 nike

我目前正在通过一本教科书自学一些基本的 Java,并给自己布置了一个“作业问题”,但是在写入方法的 .txt 文件时遇到了困难。它不想带超过2人。以下是该方法的用途的快速概述:

1.) 收集用户想要输入数据文件的人数

2.) 以二维数组收集每个人的名字和姓氏

3.) 收集用户为用户输入数组的每个(单独)人设置的付款数量。

4.) 然后它计算进入另一个数组的每个人的平均付款(因此每个人都应该有自己的平均付款)

5.) 最后,它将数据写入名为“BusinessData.txt”的 .txt 文件。

它似乎工作得很好,直到它尝试将 2 个人以上写入 .txt 文件。这让我抓狂,我真的很想知道如何解决这个问题,然后再继续讨论接下来的几个主题。

以下是当我尝试添加 2 人以上时收到的错误消息:

Exception in thread "main" java.lang.Array IndexOutofBoundsException: 3
at Business1.dataCollect(Business1.java:210)
at Business1.main(Business1.java:62)

我非常感谢任何提示。

这是实际的代码:

import java.util.*;
import java.io.*;

public class Business1
{
public static void main(String[] args) throws IOException
{
// Declare local variables
int menuChoice;

// Declare local objects
Scanner input = new Scanner(System.in);

// Display the program title
System.out.println("\n\n\n\n\t\t\t\t***************************************\n"
+ "\t\t\t\t* Average Customer Payment Calculator *\n"
+ "\t\t\t\t***************************************\n\n\n");

// Start of a do-while loop: Continues the program as long as the user doesn't choose to exit
do
{
// Start of a do-while loop: Input Validation (menuChoice must be between 1 - 4)
do
{

// Prompt user for menuChoice
System.out.print("\tPlease enter an integer in accordance to the given choices:\n\n"
+ "\t(1) Collect and Erase Old Data\n"
+ "\t(2) Read Saved Data\n"
+ "\t(3) Append Old Data\n"
+ "\t(4) Exit Program\n\n"
+"\tEnter Choice: ");

menuChoice = input.nextInt();
System.out.println("\n\n");


// If menuChoice is equal to 1: Erase old Data and Collect and Write new data
if(menuChoice == 1)
{
try
{
dataCollect();
}

catch(IOException e)
{
System.out.println("Error");
}
}
// else if menuChoice is equal to 2: Read Saved Data
else if(menuChoice == 2)
{

}
// else if menuChoice is equal to 3: Append Old Data
else if(menuChoice == 3)
{

}
// else if menuChoice is equal to 4: Exit Program
else if(menuChoice == 4)
{
System.out.println("\n\n\n\t\tGoodbye!\n\n\n");
}

// else display error message: Error. Please enter a number 1 - 4
else
{
System.out.println("\n\nERROR. Please enter a number 1 - 4\n\n");
}

// End of do-while loop: Input Validation (menuChoice must be between 1 - 4)
} while(menuChoice < 1 || menuChoice > 4);
// End of a do-while loop: Continues the program as long as the user doesn't choose to exit
} while(menuChoice != 4);
}

// Create a method named dataCollect
public static void dataCollect() throws IOException
{
// Declare local variables
int numPeople, numPayments /* array size for payments */;
double totalPayments = 0, averagePayment;
double [] paymentsArray /* different payments */, averagePaymentsArray;
String [][] namesArray /* First name, last name in array */;

// Declare objects
Scanner keyboard = new Scanner(System.in);


// Prompt user for the number of people they would like to add to the records and store in variable numPeople
System.out.print("\tHow many people would you like to add to your records?\n\n\tEnter an integer: ");
numPeople = keyboard.nextInt();
System.out.println("\n\n");

// Initialize arrays
namesArray = new String[numPeople][2];


// Create a counter for the for-loop
int count = 0;
// For-loop will prompt user for first and last name of each person
for(int i = 1; i <= numPeople; i++)
{

// Consume the remaining newline character
keyboard.nextLine();

// Prompt user for first name
System.out.print("\tPlease enter the FIRST name of person #" + i +": ");
namesArray[count][0] = keyboard.nextLine();
System.out.println("\n\n");

//Prompt user for last name
System.out.print("\tPlease enter the LAST name of person #" + i + ": ");
namesArray[count][1] = keyboard.nextLine();
System.out.println("\n\n\n");

count++;
}

// Reset counter for the next for-loop
count = 0;
int count2 = 1; // Used to keep track of which payment number the user is inputing
int count3 = 0;
int count4 = -1;


// ****************************************************************
// * Open file for input ******************************************
// ****************************************************************

PrintWriter outputFile = new PrintWriter("BusinessData.txt");
outputFile.println("\t\t\tBusiness Data\n\n");
outputFile.println("First Name\tLast Name\tP 1\t\tP 2\t\t P 3\t\tAverage Payments\n\n"
+ "------------------------------------------------------------------------------------------------------------------------------------------------------\n");

// For-loop will ask for number of payments each person made while also collecting the value of each of those payments in a nested for-loop.
for(int i = 0; i < numPeople; i++)
{
// Prompt user for first name
System.out.print("\tPlease enter the number of payments made by " + namesArray[count][0] +" " + namesArray[count][1] + "(Put in 3 for now) : ");
numPayments = keyboard.nextInt();


System.out.println("\n\n");

// Initialize array then reset it for the next person to come
paymentsArray = new double[numPayments];

for(int j = 0; j < numPayments; j++)
{
// ****************************************************************
// * Open file for input ******************************************
// ****************************************************************

System.out.print("\n\n\tPlease enter payment value of payment #" + count2 + " that " + namesArray[count][0] +" " + namesArray[count][1] + " made: $");
paymentsArray[j] = keyboard.nextDouble();
System.out.println("\n\n");

// Increment counter
count2++;
}

// ************************************************************************
// * Calculating Average Payment ******************************************
// ************************************************************************

// For loop for calculating average
for(int k = 0; k < numPayments; k++)
{
totalPayments += paymentsArray[k];
}

// Calculate the Average Payment
averagePayment = totalPayments/paymentsArray.length;

/**************************************************
********** BUG LIES IN THE WRITING **************
***************************************************/


// nested for-loop will write data now otherwise it'll just be wiped out and overwritten by the next input
for(int l = 1; l < numPeople; l++)
{

// Increment counter4
count4++;
// Output first name
outputFile.print(namesArray[count4][count3]);

// Increment counter3
count3++;

// Output last name
outputFile.print("\t\t" + namesArray[count4][count3] + "\t\t");
// Reset counter3
count3 = 0;


for (int m = 0; m < numPayments; m++)
{
outputFile.print(paymentsArray[m] + "\t\t");
}

outputFile.println(averagePayment + "\n\n");
}


// Reset total Payments for the next iteration
totalPayments = 0.0;

// Increment the counter
count++;
}
outputFile.close();

// End of dataCollect method
}

最佳答案

运行您的代码会给我 3 个以上用户带来的异常。ArrayIndexOutOfBoundsException 抛出于

  outputFile.print(namesArray[count4][count3]);

在 Debug模式下运行显示namesArray[count4][count3]指向一个不可用的值。

由于下面的循环,count4 被增加到越界值。

我不明白为什么你需要这个循环

for(int l = 1; l < numPeople; l++)
{
enter code here}

如果删除它,它就可以正常工作。

关于java.lang.ArrayIndexOutOfBoundsException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42744509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com