索引越界,java

Index out of bound, java

提问人:Eric Karaeen 提问时间:12/30/2021 更新时间:12/30/2021 访问量:103

问:

我有一个关于数组中索引越界错误的问题。 我想创建一个方法,该方法将月和日作为参数并返回一年中的某一天。如果任何参数不正确,则该方法应返回 0。

例如,如果方法收到 2 和 3,即 2 月 3 日,则它必须返回 34。如果它收到 12 和 31,则必须返回 365。 但是我遇到了索引越界的问题,无法解决任何提示。 这是我的代码。

公共类 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;
    

    
    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;
    
}

}

日历 数组 索引 超出范围异常

评论

0赞 laenNoCode 12/30/2021
if(month >= 13) 在 for 循环之后被调用。因此,如果你用 month = 14 调用你的函数(例如),它将超出数组的边界,因为 j 上升到 13 > 11,而你的数组只有 12 个元素。为了防止这种情况,您应该提前返回或 if else 语句

答:

0赞 Yahli Gitzi 12/30/2021 #1

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

    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;
    }
}
0赞 Daniel Kiptoon 12/30/2021 #2

对于函数,始终首先进行健全性检查,以确保您获得的输入符合您的期望,在这种情况下,我们预计月份值介于 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;
        
    }

评论

0赞 Eric Karaeen 12/31/2021
哟,谢谢大家,将开始更多地使用此页面。惊人的帮助。将永远记住理智检查。