日食中不断出现几个错误

时间:2016-01-27 00:32:38

标签: java

我试图编写一个打开txt文件并显示该txt文件信息的程序。 Java是我的第一语言,我将java作为第二语言课程,因为我的学校里没有java课程。我用这个代码挣扎了大约一个星期。任何一点帮助都会有所帮助。感谢您的帮助。

一直说:

Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException:6

at store.Franchise.<init>(Franchise.java:10)

at store.FileIO.readData(FileIO.java:10)

at store.Driver.main(Driver.java:9)

以下是我所得到的:

示例txt文件:

Day1    Day2    Day3    Day4    Day5
2541.56 2258.96 2214    2256    2154
2041.56 1758.96 1714    1756    1654
3041.56 2758.96 2714    2756    2654
3563.54 3280.94 3235.98 3277.98 3175.98
2547.21 2264.61 2219.65 2261.65 2159.65
4040.55 3757.95 3712.99 3754.99 3652.99

Store.java:

package store;

import java.io.IOException;

public class Store {


   private float salesByWeek[][];

   public Store() {

    salesByWeek = new float[5][7];
   // assign the array value at index 5, t to salesByWeek
   }


   public void setSaleForWeekDayIntersection(int week, int day, float sale) {

   salesByWeek[week][day] = sale;
   // store the sale value to SalesByWeek array at the index pointed to by week, day
   // for exaample, it can be week 2 and day 3 (Wednesday)


}


float[] getSalesForEntireWeek(int week) {
   // this will find the total sales for the whole week - all 5 days or 7 days including week ends Saturday and Sunday

   float[] sales = new float[7];
   // declare an array of type float and of size 7 - name the array as sales

       for (int d = 0; d < 7; d++)
            {

                sales[d] = salesByWeek[week][d];
               // the index d runs from 0 to 7

           }
       return sales;

 }


  float getSaleForWeekDayIntersection(int week, int day) {

   return salesByWeek[week][day];
   // the return value is the arraycontent pointed to by index week and day

 }

  float getTotalSalesForWeek(int week) {

   float total = 0;

       for (int d = 0; d < 7; d++)
       {
           total += salesByWeek[week][d];

           // increment total by adding the array content salesByWeek at index week, d ( if d is the day)

           }

       return total;
       // send the value of total back to the caller function

    }


 float getAverageSalesForWeek(int week) {

   return getTotalSalesForWeek(week) / 7;
   // divide the total sales for the whole week by 7 so that we get the average sales and return it

 }


   float getTotalSalesForAllWeeks() {

   float total = 0; // declare a total variable of type float and initialize to 0 ( zero)

       for (int w = 0; w < 5; w++)
       {

           total += getTotalSalesForWeek(w);
           // sum up the total for the whole week and store it to the total variable

       }

       return total;
      // return the sum computed above
   }


  float getAverageWeeklySales() {

   return getTotalSalesForAllWeeks() / 5;
   // AVERAGE for 5 days - just Monday to Friday only - excludes the week ends

  }


   int getWeekWithHighestSaleAmount() {
   // top performing sales in the whole week

   int maxWeek = 0;
   float maxSale = -1;

       for (int w = 0; w < 5; w++)
           // run the for loop from 0 to 5 in steps of 1
       {

           float sale = getTotalSalesForWeek(w);
           // first store the total sales in to the sale variable of type float
           if (sale > maxSale)
               {    // if at all if we find any amount greater than the max sale then replace max sale with the new sale amount
                   // and also note down the contributor - in the sense that which w ( week) achieved top sales
               maxSale = sale;
               maxWeek = w;
               }
           }

       return maxWeek;

  }


 int getWeekWithLowestSaleAmount() {

   int minWeek = 0;
   float minSale = Float.MAX_VALUE;
       for (int w = 0; w < 5; w++)
       {
           float sale = getTotalSalesForWeek(w);
       if (sale < minSale)
       {
           minSale = sale;
           minWeek = w;
           }
       }
      // comments are same as the top sales except in reverse order
       // first store an arbitary minimum sale figure
       // then compare each running week's vaue with the lowest
       // if at all when we encounter any value lower than the preset value then replace it
       return minWeek;
      // finally return the minimum value in that week
   }
   public void analyzeResults() {

   for (int w = 0; w < 5; w++) // run the for loop from 0 to 5
   {
       System.out.printf("---- Week %d ----\n", w); // print a title decoration
       System.out.printf(" Total sales: %.2f\n", getTotalSalesForWeek(w)); // display or print out the total sales summed earlier in called function
       System.out.printf(" Average sales: %.2f\n", getAverageSalesForWeek(w)); // display the average sales figure

   }
   System.out.printf("\n");
   System.out.printf("Total sales for all weeks: %.2f\n", getTotalSalesForAllWeeks());    // print sum of the sales for the entire week
   System.out.printf("Average weekly sales: %.2f\n", getAverageWeeklySales()); // print weekly average sales
   System.out.printf("Week with highest sale: %d\n", getWeekWithHighestSaleAmount());   // print highest performing or top sales
   System.out.printf("Week with lowest sale: %d\n", getWeekWithLowestSaleAmount()); // print lowest sales or the struggling week
    }

public void setsaleforweekdayintersection(int week, int day, float f) {


}
}

Franchise.java:

package store;
public class Franchise {
private Store stores[];

public Franchise(int num) { // now for a franchise store
       stores = new Store[num];   // instantiate an array object of type class Store
       // the class is Store
       // the objects are named as stores

       for(int i=0; i<=num; i++) stores[i] = new Store();
  }

   public Store getStores(int i) { // GETTER display or return values
   return stores[i];
   }

   public void setStores(Store stores, int i) { // setter assign values
   this.stores[i] = stores;
   }


}

FileIO.java:

package store;


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

public class FileIO {
   // Franchise readData(String filename)
Franchise readData(String filename, int numstores) {
   Franchise f1 = new Franchise(numstores);
   boolean DEBUG = true;
   int ctr = 0;
   // open the file
   // read the line
   // parse the line - get one value
   // and set it in the correct location in 2 d array
   try {
       FileReader file = new FileReader(filename); // file is equivalent to a file pointer in c/c++
       BufferedReader buff = new BufferedReader(file); // buffered reader will read a chunk in to the variable buff
       boolean eof = false;
       while (!eof) {
           String line = buff.readLine();
           ctr++;
           if (line == null)
               eof = true;
           else {
               if (DEBUG)
                   System.out.println(line);
               if (ctr > 1) {
                   StringTokenizer a = new StringTokenizer(line);
                   for (int week = 0; week < 5; week++) {
                       for (int day = 0; day < 7; day++) {
                           String l = a.nextToken();
                           float f = Float.parseFloat(l);     // parseFloat will store to variable f of type float
                           f1.getStores(ctr - 2)
                                   .setsaleforweekdayintersection(week,
                                           day, f);
                           if (DEBUG)
                               System.out.print("f" + f + " ");
                       }
                   }
               }
           }

       }
   } catch (IOException f2) {

   }
   return f1;
  }
}

Driver.java:

package store;


public class Driver
{
public static void main(String[] args)
{
   FileIO readdata = new FileIO();
   Franchise f1 =      readdata.readData("E:/Files/Salesdat.txt", 6);

   System.out.println("Data read");

}

}

DriverImpl.java(我不知道为什么我需要这个子类,但是我的导师告诉我我需要这个):

package store;


public class DriverImpl extends Driver {

}

2 个答案:

答案 0 :(得分:1)

我想将Franchise.java中的第10行更改为

for(int i=0; i<num; i++) stores[i] = new Store(); 

注意我删除了&lt; =并且放了一个=。每当处理数组索引时,应始终使用&lt;比较大小作为一种良好的做法。

答案 1 :(得分:0)

数组中的有效索引为0length - 1。将<=更改为<,例如

stores = new Store[num];
// the class is Store
// the objects are named as stores

for(int i=0; i<num; i++) stores[i] = new Store(); //stores[num] is invalid.