Java 2维数组抛出界限

时间:2016-01-14 20:51:21

标签: java arrays

我是数组的新手。

我创建的这个程序是对BlueJays类中的每个方法抛出一个越界错误。

说实话,我甚至不确定我是否正在搜索阵列。任何帮助将不胜感激。

由于

这是我的主要

public class Lab1 {

static final int NBPLAYERS = 11;
static final int NBMONTHS = 6;

public static void main(String[] args) {

    String[] month = {"April", "May","June", "July", "August","September"};
    String[] players = {"Colabello","Donaldson","Smoak","Martin","Goins","Encarnacion","Carrera","Tulowitzki","Pillar","Bautista","Travis"};
    double[][] battingAvg = {
                    {0,.368,.300,.224,.386,.268},
            {.319,.306,.269,.287,.324,.296},
            {.229,.310,.213,.191,.203,.262},
            {.197,.327,.239,.256,.138,.213},
            {.276,.236,.172,.240,.314,.279},
            {.205,.225,.303,.241,.407,.279},
            {0,.302,.282,.244,.333,.231},
            {0,0,0,.357,.214,.237},
            {.273,.181,365,.283,.240,.323},
            {.164,.295,.226,.219,.286,.293},
            {.325,.189,.313,.368,0,0}};

    double [][] onBase = {
                    {.417,.330,.286,.413,.362,.429},        
            {.370,.373,.322,.370,.408,.403},
            {.372,.333,.275,.283,.243,.324},
            {.367,.362,.329,.322,.263,.300},
            {.323,.278,.221,.286,.442,.347},
            {.258,.333,.382,.384,.460,.411},
            {0,.357,.333,.277,.333,.313},
            {0,0,0,.400,.325,.250},
            {.297,.237,.380,.323,.283,.363},
            {.325,.418,.388,.300,.370,.436},
            {.393,.246,.313,.421,0,0}};


    PlayerStats Player;

    BlueJays team = new BlueJays(NBPLAYERS, NBMONTHS);

    team.getHighestSingleMonthBattingAvg();

    team.getHighestOnBase(5);

    team.getLowestBattingAvg(6);

    team.getBestMonth("Bautista");

    team.getBestOverallRecord();

    team.getLowestOnBase();
}
}

这是我的PlayerStats,它有accessor / mutator方法。

class PlayerStats {

private String name;
private int month;
private double battAvg, onBase;


public PlayerStats(String name, int month, double battingAvg, double onBase2) {

    this.name = name;
    this.month = month;
    this.battAvg = battingAvg;
    this.onBase =  onBase2;

}

public String getName() {

    return name; 
}

public void setName(String name) {

    this.name = name;
}

public int getMonth() {

    return month;
}

public void setMonth(int month) {

    this.month = month; 
}


public double getAvg() {

    return battAvg;
}

public double getOnBase() {

    return onBase;
}

public double getBoth() {

    return battAvg + onBase;
}

}

这是创建2d数组的类。

class BlueJays {

int nbPlayers;
int nbMonths;
int j = 0;
int highestBattingAvg;
int highestBattingMonth;
String highestBattingPlayer;
int highestOnBase;
int lowestAvg;
String lowestAvgPlayer;
int highestOverall;
String highestOverallPlayer;
int lowestOnBase;
int lowestOnBaseMonth;
String highestOnBasePlayer;
double bestOverAllMonth;



public BlueJays(int nbplayers2, int nbmonths2) {
    this.nbPlayers = nbplayers2;
    this.nbMonths = nbmonths2;

}

    PlayerStats[][] stats = new PlayerStats[nbPlayers][nbMonths];

PlayerStats setPlayerStatsCell(PlayerStats player, int iPlayer, int iMonth) {
    return player;


}


PlayerStats getHighestSingleMonthBattingAvg() {

    while(j < nbMonths) {

        for(int i = 0; i < nbPlayers; i++)  {
            stats[i][j].getAvg();


            if(highestBattingAvg < stats[i][j].getAvg()) {
                highestBattingMonth = stats[i][j].getMonth();
                highestBattingPlayer = stats[i][j].getName();

            }

            if (i == nbMonths) {
                j++;
                i = 0;

            }

            System.out.println("Highest average batting player for the month " + highestBattingMonth + " is " + highestBattingPlayer);

        }
    }


    return null;


}

PlayerStats getHighestOnBase(int month) {

    while(j < nbMonths) {

        for(int i = 0; i < nbPlayers; i++)  {
            stats[i][month].getOnBase();

            if(highestOnBase < stats[i][month].getOnBase()) {

                highestOnBasePlayer =  stats[i][month].getName();
            }

            if (i == nbMonths) {
                j++;
                i = 0;

            }
            System.out.println("Highest average onBase player for the month " + month + highestOnBasePlayer);

        }
    }


    return null;

}


public PlayerStats getLowestBattingAvg(int month) {

    while(j < nbMonths) {

        for(int i = 0; i < nbPlayers; i++)  {
            stats[i][month].getOnBase();

            if(lowestAvg > stats[i][month].getAvg()) {

                lowestAvgPlayer =  stats[i][month].getName();
            }

            if (i == nbMonths) {
                j++;
                i = 0;

            }

            System.out.println("Lowest average batting player for the month " + month + " is " + lowestAvgPlayer);

        }
    }
    return null;

}

   PlayerStats getBestMonth(String player) {

   while(j < nbMonths) {

        for(int i = 0; i < nbPlayers; i++)  {
            stats[i][j].getBoth();

            if(bestOverAllMonth > stats[i][j].getAvg() && stats[i][j].getName().contains(player)) {


                 bestOverAllMonth =  stats[i][j].getBoth();


            }

            if (i == nbMonths) {
                j++;
                i = 0;

            }
            System.out.println("Best month for the player " + player + " is " + bestOverAllMonth);


        }
    }
    return null;






}

public String getBestOverallRecord() {

    while(j < nbMonths) {

        for(int i = 0; i < nbPlayers; i++)  {
            stats[i][j].getBoth();

            if(highestOverall < stats[i][j].getBoth()) {

                highestOverallPlayer =  stats[i][j].getName();
            }

            if (i == nbMonths) {
                j++;
                i = 0;

            }

            System.out.println("Highest overall record is " + highestOverallPlayer);

        }
    }
    return null;



}



public PlayerStats getLowestOnBase() {

    while(j < nbMonths) {

        for(int i = 0; i < nbPlayers; i++)  {
            stats[i][j].getOnBase();

            if(lowestOnBase > stats[i][j].getOnBase()) {

                double lowestOnBase =  stats[i][j].getOnBase();

                if(lowestOnBase > 0) {

                    lowestAvgPlayer = stats[i][j].getName();

                } else {

                    i++;
                }
            if (i == nbMonths) {
                j++;
                i = 0;

            }

        }
            System.out.println("Lowest On Base is  " + lowestOnBase);


    }



}
    return null;

}
}

这是例外

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at BlueJays.getHighestSingleMonthBattingAvg(BlueJays.java:42)
at Lab1.main(JonathanRoy_Lab1.java:40)

2 个答案:

答案 0 :(得分:2)

你的问题可能在这里:

// ... lots of other stuff
public BlueJays(int nbplayers2, int nbmonths2) {
     this.nbPlayers = nbplayers2;
     this.nbMonths = nbmonths2;
}

PlayerStats[][] stats = new PlayerStats[nbPlayers][nbMonths];

如果您初始化BlueJay - 类的实例,则会在设置值nbPlayersnbMonths之前创建数组。所以你将拥有一个大小为0和0的数组。

为避免这种情况,您必须执行以下操作:

// ... lots of other stuff
public BlueJays(int nbPlayers, int nbMonths) {
    this.nbPlayers = nbPlayers;
    this.nbMonths = nbMonths;
    // doesn't matter if you take the parameters or fields
    this.stats = new PlayerStats[nbPlayers][nbMonths];
}

希望我能帮助你:)

答案 1 :(得分:0)

我不知道异常是什么,但这是我通过扫描代码得到的。

  1. 您永远不会重置j,因此大多数函数调用都不会超过第一次比较。
  2. 函数调用team.getLowestBattingAvg(6);使用索引6,但自nbMonths=6以来,您可以使用的最高索引是5(索引从0到5,包括0和5)。