0

我对数组中的索引越界错误有疑问。我想创建一个以月份和日期为参数并返回一年中的日期的方法。如果任何参数不正确,该方法应返回 0。

例如,如果方法接收到 2 和 3,这意味着 2 月 3 日它必须返回 34。如果它接收到 12 和 31,它必须返回 365。但是我遇到了这个索引超出范围的问题,无法解决任何问题提示。这是我的代码。

公共类日历方法{

public static int dayInYear(int month, int day){

int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    int yearCalculation = 0;
    int monthCalculation = 0;
    

    
    for (int j = 0; j < month-1; j++) {
        monthCalculation = monthCalculation + daysInMonth[j];
    
    }
    
    yearCalculation = monthCalculation + day;
    if (month <= 0 ) {
        yearCalculation = 0;
    }
    if (month >= 13){
        yearCalculation = 0;
    }
    return yearCalculation;
    
}

}

4

2 回答 2

0

您应该在循环前一个月进行边界检查。对此的解决方法是:

    public class CalendarMethods {
    
    public static int dayInYear(int month, int day){
    
        int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        int yearCalculation = 0;
        int monthCalculation = 0;

        if (month > 0 && month < 13) {
           if (day > 0 && day <= daysInMonth[month - 1]) { // extra: check if entered day makes sense
             for (int j = 0; j < month-1; j++) {
               monthCalculation = monthCalculation + daysInMonth[j];
             }
        
             yearCalculation = monthCalculation + day;
          }
       }

        return yearCalculation;
    }
}
于 2021-12-30T13:25:56.677 回答
0

对于函数,始终首先进行完整性检查以确保您获得的输入符合您的预期,在这种情况下,我们预计月份的值在 1 到 12 之间,因此与您的实现相同,但在处理其余代码之前检查输入. 这使您免于意外/错误输入的异常。

   public static int dayInYear(int month, int day){


        if (month <= 0||month >= 13 ) {
           return 0;
        }
   
    
        int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        
        int yearCalculation = 0;
        int monthCalculation = 0;
        
    
        
        for (int j = 0; j < month-1; j++) {
            monthCalculation = monthCalculation + daysInMonth[j];
        
        }
        
        yearCalculation = monthCalculation + day;
       
        return yearCalculation;
        
    }
于 2021-12-30T14:01:05.047 回答