title: Java 2 dimensional array throwing out of bounds
body: <p>I'm new with arrays.</p>
  
  <p>This program i have created is throwing an out of bounds error with every method inside of the BlueJays class.</p>
  
  <p>To be honest, im not even sure if im searching through the array right. Any help would be appreciated.</p>
  
  <p>Thanks</p>
  
  <p>This is my main</p>
  
  <pre><code>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();
  }
  }
  </code></pre>
  
  <p>This is my PlayerStats which has accessor/mutator methods.</p>
  
  <pre><code>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;
  }
  
  }
  </code></pre>
  
  <p>And this is the class where the 2d array is created.</p>
  
  <pre><code>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 &lt; nbMonths) {
  
          for(int i = 0; i &lt; nbPlayers; i++)  {
              stats[i][j].getAvg();
  
  
              if(highestBattingAvg &lt; 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 &lt; nbMonths) {
  
          for(int i = 0; i &lt; nbPlayers; i++)  {
              stats[i][month].getOnBase();
  
              if(highestOnBase &lt; 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 &lt; nbMonths) {
  
          for(int i = 0; i &lt; nbPlayers; i++)  {
              stats[i][month].getOnBase();
  
              if(lowestAvg &gt; 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 &lt; nbMonths) {
  
          for(int i = 0; i &lt; nbPlayers; i++)  {
              stats[i][j].getBoth();
  
              if(bestOverAllMonth &gt; stats[i][j].getAvg() &amp;&amp; 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 &lt; nbMonths) {
  
          for(int i = 0; i &lt; nbPlayers; i++)  {
              stats[i][j].getBoth();
  
              if(highestOverall &lt; 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 &lt; nbMonths) {
  
          for(int i = 0; i &lt; nbPlayers; i++)  {
              stats[i][j].getOnBase();
  
              if(lowestOnBase &gt; stats[i][j].getOnBase()) {
  
                  double lowestOnBase =  stats[i][j].getOnBase();
  
                  if(lowestOnBase &gt; 0) {
  
                      lowestAvgPlayer = stats[i][j].getName();
  
                  } else {
  
                      i++;
                  }
              if (i == nbMonths) {
                  j++;
                  i = 0;
  
              }
  
          }
              System.out.println("Lowest On Base is  " + lowestOnBase);
  
  
      }
  
  
  
  }
      return null;
  
  }
  }
  </code></pre>
  
  <p>Here is the exception</p>
  
  <pre><code>Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
  at BlueJays.getHighestSingleMonthBattingAvg(BlueJays.java:42)
  at Lab1.main(JonathanRoy_Lab1.java:40)
  </code></pre>