2017-03-12 11 views
1

私は現在、テキストブックを使って自分自身の基本的なJavaを教えており、自分自身に「宿題の問題」を与えましたが、メソッドの.txtファイルに書き込むときに問題があります。それは2人以上を取ることを望んでいません。 )java.lang.ArrayIndexOutOfBoundsException?

1.ユーザーは、データファイル

2に入りたい人の数を収集します)の最初と最後の名前を収集します。ここでは簡単の実行は、メソッドが行うことに意味されるもののダウン2次元配列の各人

3.)ユーザが配列に入力した(別個の)人ごとに、ユーザによって設定されたいくつかの支払いを収集する。

4)そして、それは最後に、それは.txtファイルにデータを書き込む人のそれぞれの平均支払が別の配列(その一人一人が自分の平均を持っている必要があります)

5)を締結した計算"BusinessData.txt"という名前です。

.txtファイルに2人以上の人物を書き込もうとするまで、完全に動作しているようです。それは私を苦労させているし、次のトピックに進む前にこれを修正する方法を本当に知りたいと思っています。

ここで私は2人以上を追加しようとすると、私は取得していますエラーメッセージです:スレッドで

例外「メイン」java.lang.ArrayはIndexOutOfBoundsException: Business1.dataCollectでは、( Business1.java:210)私は非常に任意のヒントをいただければと思います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 
    } 
+0

ごめんなさい。私は戻って、エラーメッセージを追加しました。ここでは、次のとおりです。スレッド "メイン" java.lang.ArrayはIndexOutOfBoundsExceptionで 例外:3 \t Business1.dataCollectで(Business1.java:210) \t Business1.mainで(Business1.java:62)そのことについて申し訳ありません – jonnybro

答えて

0

は私3+ユーザーのための例外を提供します。デバッグモードで実行

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

でスロー ArrayIndexOutOfBoundsExceptionがnamesArrayは[count4] [COUNT3]利用できない値を指していることを示しています。

count4は、以下のループのために範囲外の値にインクリメントされます。

あなたは

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

このループを必要とする理由私はあなたがこれを削除した場合、それは正常に動作undertstandません。

+0

。私は戻って、エラーメッセージを追加しました(私は7文字以上だったので、ここに置くことはできませんでした)。 上記のforループは、収集したすべてのデータを "BusinessData.txt"という名前の.txtファイルに書き込むことを目的としています。"ループがなければ、後で作成する別の方法でデータを読み込む代わりに、プログラムを開くたびにデータを再入力する必要があります。変数 'l'、 'm'の初期値を変更しようとしましたが、 'と' count4 'は運がありませんでしたが、運がなかったのです – jonnybro

+0

しかし、count4はループ内で不必要に増加しています。そこでコードロジックを書き直してください。 –

+0

ありがとうございました問題は、変数 'l'を含むfor-loopで始まる不要なネストされたfor-loopがあったことです。また、最初の次元をインクリメントするために "count4"の代わりに "i"を使用する必要があります2次元配列の2次元配列 – jonnybro

関連する問題