2

有人可以帮我解决下面发布的错误吗?该程序运行,但是当调用显示捐赠时,我的主程序出现错误。我该如何解决这个问题才能运行?它与语法错误有关吗?这是我第一次使用数组,所以我欢迎对良好习惯的反馈。谢谢!

 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
4

3 回答 3

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。

于 2013-08-05T23:30:30.867 回答
3

您的代码中有几个地方6直接在代码中引用索引。这里有几个:

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

但是你所有的数组都被声明为 length 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];

Java 中的数组是从 0 开始的,因此长度数组在此处n仅具有索引0throughn - 10through 5。如果你需要一个索引6,使你的数组​​长度7

于 2013-08-05T23:30:09.377 回答
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 在我们的一生中毫无价值。

继续编程,不要放弃!

于 2013-08-06T00:28:58.533 回答