2014-12-01 2 views
0

Я работаю над программой, которая занимает 3 месяца в день и год и выводит дату. У меня проблемы с дневной частью и целым високосным годом. Вот мой код:Не регистрирующий день как недействительный в течение не-високосного года

public void setDay(int d) { 
    int m = getMonth(); 
    int y = getYear(); 
    while (m > 0 && m <= 12) { 
    if ((m == 1 || m == 3 || m == 5 || m == 7 || 
    m == 8 || m == 10 || m == 12) && (d > 0 && d <= 31)) { 
     day = d; 
     break; 
    } 
    else if ((m == 4 || m == 6 || m == 9 || m == 11) && (d > 0 && d <= 30)) { 
     day = d; 
     break; 
    } 
    else if (m == 2) { 
     if ((y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0))) { 
      if (d <= 29) { 
       day = d; 
      } 
      else { 
       throw new IllegalArgumentException("Invalid day"); 
      } 

     } 
     else { 
      if (day <= 28) { 
       day = d; 
      } 
      else { 
       throw new IllegalArgumentException("Invalid day"); 
      } 
     } 

     break; 
    } 
    else { 
     throw new IllegalArgumentException("Invalid day"); 
    } 


    } 

}

Все работает отлично, за исключением того, когда я дата, 2, 29, 2001, например, его должен бросить исключение, но это не так просто печатает это из нормально

+0

Что случилось с 'java.util.Calendar'? Вероятно, вы можете использовать отладчик и выяснить проблему в своем коде, не так ли? Каковы фактические значения 'd',' m' и 'y', когда вы достигаете' while' –

+0

. Вам также не хватает края, где 'd <1' в феврале. Это то, о чем вы должны указать, что условие на самом верху и бросать «IllegalArgumentException» (с более ясным сообщением, например «день месяца (% d) не может быть меньше 1») вместо повторения проверки повсюду , – chrylis

+0

@RC. эти значения предопределены с помощью других методов, в этом случае вход: месяц - 2, день - 29, год 2001 – Zero

ответ

2

у вас есть проблема:

if (day <= 28) { 
       day = d; 
      } 

должно быть:

if (d <= 28) { 
       day = d; 
      } 
+0

Я исправил это, но моя проблема все еще сохраняется – Zero

+0

Измените это: int m = getMonth(); int y = getYear(); to: int m = 2; int y = 2001; , если он будет работать правильно, тогда у вас есть проблемы с getMonth(), getYear() (может быть, getMonth() дает 0 для 1 января для Feberuary?) –

Смежные вопросы