2013-09-12 8 views
-2

Я знаю, что это довольно просто, но я не могу понять, почему я продолжаю получать исключение из пределов. Я попытался инициализировать массивы по-разному, и это все равно не помогает. Я получаю исключение в методе toString и в части, которая проверяет, соответствует ли день правильному диапазону месяца, для которого он определен.ArrayIndexOutofBoundsException?

public class MyDate 
{ 
//variables for year day and month. 
private int year, day, month; 

//variable for n which is used to compare to the days for leap years. 
int n; 

String[] Months = {"January","Feburary","March","April","May","June","July" 
       ,"August" ,"September","October","November","December"}; 
int[] MaxDays = {31,31,31,30,31,30,31,31,30,31,30,31}; 

public MyDate(int year, int day, int month) 
{  
    //Checks to see if the year is valid. 
    if (year < 1600 || year > 3000) 
    { 
     System.out.println("The year entered is not valid, " 
       + "You entered: " + year); 
     System.out.println("The year must be between 1600 and" 
       + " 3000."); 
     System.exit(0); 
    } 
    //Checks to see if the month is valid. 
    if (month < 1 || month > 12) 
    { 
     System.out.println("The month is not valid, " + "You Entered: " 
       + month); 
     System.out.println("The month must be between 1 and 12."); 
     System.exit(0); 
    } 

    //Checks to see if the day is valid 
    if (day >= MaxDays[this.day - 1]) 
    { 
     advance(); 
    } 
    //Checks for a leap year, and if the day is valid or not. 
    if ((year % 400 == 0) || (year % 100 != 0)) 
    { 
      if (year % 4 == 0) 
      { 
       if (month == 2) 
       { 
        //Loops that goes from 27-31 comparing the day to n. 

        int n = 27; 
        do 
        { 
         if (n == day) 
         { 
          System.out.println("This is a leap year, and you entered " + n + " as the day" 
            + "\n" + "this day is not valid for a leap year"); 
          System.out.println(); 
          break; 
         } 

         if (n == 32) 
         { 
          break; 
         } 
         n++; 
        } 
        while (n == day); 

        } 
       } 
    } 
    else  
    { 
     this.year=year; 
     this.day=day; 
     this.month=month; 
    } 
} 

//Checks to see if two dates are equal to eachother. 
public boolean equals(Object obj) 
{ 
    if (obj instanceof MyDate){ 
     MyDate d = (MyDate)obj; 
     if (this.getMonth()==d.getMonth() && this.getDay()==d.getDay() && 
      this.getYear()==d.getYear()) 
      return true; 
     else 
      return false; 
    } 
    return false; 
} 

//gives a general format for the month day and year. 
public String toString() 
{ 
    return Months[month - 1] + " " + day + "," + year + ""; 
} 
+3

Запустили ли вы это в отладчике? Это, как правило, самый простой способ найти эти вещи. –

+0

Пожалуйста, разместите весь текст исключения и отметьте, в какой строке вашего кода он жалуется. –

+0

изменить MaxDays [this.day-1] на MaxDays [месяц-1]; –

ответ

1

Кажется, проблема исходит оттуда

if (day >= MaxDays[this.day - 1]) 

где this.day = 0

Я полагаю, вы должны пройти month вместо этого.

if (day >= MaxDays[month - 1]) 

UPDATE
В вашем toString() методе month = 0, потому что вы не установили месяц раньше.
Do this.month=month; За пределами else блок в конструкторе.

+0

Спасибо большое! Вся моя проблема заключалась в том, что this.year = year; и так далее в инструкции else, и он не устанавливал правильные значения, они просто устанавливали на 0 автоматически. –

0

Вероятно, ошибка здесь, в вашем if condition

if (day >= MaxDays[this.day - 1]) 

MaxDays [] представляет собой массив из 12 элементов - индекс 0 - 11

days can be from 1-31, так что если day is greater than 12, it will give an IndexOutOfBoundException.

В вашем коде, хотя это wo uld всегда будет нулевым, так как вы не инициализируете его перед его использованием.

+0

'this.day' всегда 0 в этой строке, а' day' может быть любым числом в этом конструкторе. Поэтому проблема заключается в 'this.day', но не в' day'. – Alex

+0

@Alex согласился. Ред. – JNL