2013-08-05 2 views
2

Может кто-нибудь помочь мне с сообщением об ошибке? Программа запускается, но я получаю сообщение об ошибке, касающейся моего основного, когда вызывается пожертвование на показ. Как я могу исправить это, чтобы он работал? Это связано с синтаксической ошибкой? Это мой первый опыт работы с массивами, поэтому я приветствую отзывы о хороших привычках. Благодаря!Индекс массива Java за пределами границ?

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
     at donations.processDonations(donations.java:78) 
     at donations.main(donations.java:33) 

    import java.util.Scanner; //needed for input 

    public class donations { 
     static double[] cashDonations = new double[6]; // stores the cash donations 
                 // from 6 sites 
     static double[] lbsFood = new double[6]; // stores the pounds of food 
                // donated from 6 sites 
     static String[] siteName = new String[6]; // stores the names of the 6 sites 
     static String bestSiteCash = " "; // stores the site name with the highest 
              // cash donation 
     static String bestSiteFood = " "; // stores the site name with the highest 
              // food donation 
     static double totalCash = 0; // stores the total cash collected for all 
             // sites 
     static double totalFood = 0; // stores the total food pounds collected for 
             // all sites 
     static double maxFood = 0; // store the highest food collection 
     static double maxCash = 0; // stores the highest cash collection 

     public static void main(String[] args) { 

      Scanner input = new Scanner(System.in); // needed for input 
      String anotherCourse = "yes"; // variable to control running program 
              // again 
      do { 

       getDonations(); 
       processDonations(); 
       displayDonations(); 

       // This code ends the do while to run again 
       System.out.print("Enter yes if you want to run again: "); 
       anotherCourse = input.next(); 
       input.nextLine(); // causes skipping issue to fix 
       System.out.print("\n\n\n"); 
      } while (anotherCourse.equalsIgnoreCase("yes")); 

     } // end of main 

     public static void getDonations() { 
      Scanner input = new Scanner(System.in); // needed for input 
      // Prompt user for site info 
      for (int i = 0; i < 6; i++) { 
       System.out.println("Enter site " + (i + 1) + " name: "); 
       siteName[i] = input.next(); 

       System.out.println("Enter cash donation(USD) for " + siteName[i] 
         + ": "); 
       cashDonations[i] = input.nextDouble(); 
       // double [] cashDonations = new double [6]; You have this already 
       // at the top 
       // int i; 
       // for (i = 0 ; i < 6 ; i++) 

       // cashDonations[i] = input.nextDouble(); 

       // double [] lbsFood = new double [6]; 
       System.out.println("Enter food donation(lbs.) for " + siteName[i] 
         + ": "); 
       lbsFood[i] = input.nextDouble(); 

      } 

     } 

     public static void processDonations() { 
      totalCash = 0; 
      totalFood = 0; 
      maxCash = cashDonations[0]; 
      maxFood = lbsFood[0]; 

      totalCash = cashDonations[1] + cashDonations[2] + cashDonations[3] 
        + cashDonations[4] + cashDonations[5] + cashDonations[6]; 
      totalFood = lbsFood[1] + lbsFood[1] + lbsFood[2] + lbsFood[3] 
        + lbsFood[4] + lbsFood[5] + lbsFood[6]; 

     } 

     public static void displayDonations() { 
      System.out.print("Total Cash Donations are " + totalCash); 
      System.out.print("Total Food Donations are " + totalFood); 
      System.out.print("Donation totals for " + siteName[1]); 
      System.out.print("Total cash: " + cashDonations[1]); 
      System.out.print("Food donations " +lbsFood[1]); 
      System.out.println(); 
      System.out.print("Donation totals for " + siteName[2]); 
      System.out.print("Total cash: " + cashDonations[2]); 
      System.out.print("Food donations " +lbsFood[2]); 
      System.out.println(); 
      System.out.print("Donation totals for " + siteName[3]); 
      System.out.print("Total cash: " + cashDonations[3]); 
      System.out.print("Food donations " +lbsFood[3]); 
      System.out.println(); 
      System.out.print("Donation totals for " + siteName[4]); 
      System.out.print("Total cash: " + cashDonations[4]); 
      System.out.print("Food donations " +lbsFood[4]); 
      System.out.println(); 
      System.out.print("Donation totals for " + siteName[5]); 
      System.out.print("Total cash: " + cashDonations[5]); 
      System.out.print("Food donations " +lbsFood[5]); 
      System.out.println(); 
      System.out.print("Donation totals for " + siteName[6]); 
      System.out.print("Total cash: " + cashDonations[6]); 
      System.out.print("Food donations " +lbsFood[6]); 
      System.out.println(); 

     }// end of displayDonations() 

    }// end of class 
+0

(i + 1) = 6, когда i = 5, и вы получаете ошибку, потому что последний индекс равен 5 – VirtualTroll

+0

, поэтому мне нужно выполнить нулевое значение через 5? – user2644085

+0

Я предполагаю, что для целей первых заданий и т. Д. Вам, вероятно, придется использовать массивы, но только если вы сможете открыть ASAP коллекции, которые предлагают приятные динамически расширяемые структуры данных (списки, наборы и т. Д.). – andi

ответ

5
static double[] cashDonations = new double[6]; 

Это массив с 6 пробелами, правильный. Однако:

maxCash = cashDonations[0]; 
totalCash = cashDonations[1] + cashDonations[2] + cashDonations[3] + cashDonations[4] + cashDonations[5] + cashDonations[6]; 

Здесь вы видите 7 пробелов. 0, 1, 2, 3, 4, 5 и 6.

+0

нет кода, который я могу положить, чтобы он начинался как один? – user2644085

+0

Нет. Массивы начинаются с 0. Всегда. Вы * можете *, конечно, просто оставить первое пространство (0) неиспользованным. –

+0

ОК спасибо всем. Я буду отмечать как правильно! Мне нравится этот сайт :) – user2644085

3

У вас есть несколько мест в коде, где вы имеете в виду индекс 6 непосредственно в коде. Вот некоторые из них:

System.out.print("Donation totals for " + siteName[6]); 
System.out.print("Total cash: " + cashDonations[6]); 
System.out.print("Food donations " +lbsFood[6]); 

Но все ваши массивы объявляются длины 6.

static double[] cashDonations = new double[6]; // stores the cash donations 
                // from 6 sites 
static double[] lbsFood = new double[6]; // stores the pounds of food 
               // donated from 6 sites 
static String[] siteName = new String[6]; 

Arrays in Java are 0-based, поэтому массив длины n имеет только индексы 0 через n - 1 или 0 через 5 здесь. Если вам нужен индекс 6, сделайте свой массив длиной 7.

0

Я заметил, что вы сделали общий "офф-на-один" ошибка ¯ \ _ (ツ) _/¯

Вот вам «ве должным образом объявлены 3 массивы размером от 6:

static double[] cashDonations = new double[6]; 

    static double[] lbsFood = new double[6]; 

    static String[] siteName = new String[6]; 

Несмотря на то, действительно, 6 элементов в каждом массиве первый элемент обозначается как 0

[0], [1], [ 2], [3], [4], [5]

В вашем коде вы вызываете 7-й элемент " [6]», что не существует:

totalCash = cashDonations[1] + cashDonations[2] + cashDonations[3] 
       + cashDonations[4] + cashDonations[5] + cashDonations[6]; 

    totalFood = lbsFood[1] + lbsFood[1] + lbsFood[2] + lbsFood[3] 
       + lbsFood[4] + lbsFood[5] + lbsFood[6]; 

Чтобы исправить это вам просто нужно сделать свои элементы от 0 до 5:

totalCash = cashDonations[0] + cashDonations[1] + cashDonations[2] 
       + cashDonations[3] + cashDonations[4] + cashDonations[5]; 

    totalFood = lbsFood[0] + lbsFood[1] + lbsFood[2] 
       + lbsFood[3] + lbsFood[4] + lbsFood[5]; 

Это простая ошибка, потому что мы учили, что 0 имеет значение ничего не всю нашу жизнь.

Продолжайте программировать и не сдавайтесь!

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