Java 数组索引超出边界异常:12

Java 数组索引超出边界异常:12,java,Java,这段代码非常简单,但我就是不能让它工作。它一直说数组在第8行(while循环)超出边界,我不知道为什么,因为u每次都会重置。有什么想法吗?这可能是一个简单的解决方案,但感谢您的帮助 public class potato { public static void main(String[] args) { int year; int day = (int)((System.currentTimeMillis() + java.util.TimeZone.g

这段代码非常简单,但我就是不能让它工作。它一直说数组在第8行(while循环)超出边界,我不知道为什么,因为
u
每次都会重置。有什么想法吗?这可能是一个简单的解决方案,但感谢您的帮助

public class potato {
    public static void main(String[] args) {
        int year;
        int day = (int)((System.currentTimeMillis() + java.util.TimeZone.getDefault().getRawOffset()) / 1000.0 / 60.0 / 60.0 / 24.0);
        int[] months = {31,28,31,30,31,30,31,31,30,31,30,31};
        int u;
        for (year = 1970; year < 2018; year++) {
            u = 0;
            while (day > months[u] && u < 12) {
                day -= months[u];
                u++;
            }
        }
    }
}
公共类{
公共静态void main(字符串[]args){
国际年;
int day=(int)((System.currentTimeMillis()+java.util.TimeZone.getDefault().getRawOffset())/1000.0/60.0/60.0/24.0);
int[]月={31,28,31,30,31,30,31,31,30,31,30,31};
国际大学;
对于(年份=1970;年份<2018;年份++){
u=0;
而(日>月[u]&&u<12){
日-=月[u];
u++;
}
}
}
}

在检查天数之前检查变量u的值。将while循环条件更改为

 while ( u < 12 && day > months[u] )
while(u<12&&day>months[u])

在检查天数之前检查变量u的值。将while循环条件更改为

 while ( u < 12 && day > months[u] )
while(u<12&&day>months[u])

如果你仔细看这里

 u = 0;
 while (day > months[u] && u < 12) {
                    day -= months[u];
                    u++;
                }
u=0;
而(日>月[u]&&u<12){
日-=月[u];
u++;
}
当递增数组时,实际上是在访问while循环头中的数组。它会再次测试数组,这会导致
月[12]
超出范围


与前面的答案类似,当您说
while(ummonths[u])
时,它使用短路测试方法。因此,当
u==12
时,它会立即取消进入循环,也会取消第二个条件的测试。

如果您仔细看这里

 u = 0;
 while (day > months[u] && u < 12) {
                    day -= months[u];
                    u++;
                }
int monthsLength = months.length()-1;
// So it contains 0-11 index values
u=0;
而(日>月[u]&&u<12){
日-=月[u];
u++;
}
当递增数组时,实际上是在访问while循环头中的数组。它会再次测试数组,这会导致
月[12]
超出范围


与前面的答案类似,当您说
while(ummonths[u])
时,它使用短路测试方法。因此,当
u==12
时,它会立即取消进入循环,并取消测试第二个条件。

这是因为您的while条件

int monthsLength = months.length()-1;
// So it contains 0-11 index values
//但在你的情况下,它检查12个索引 月[u]。这将抛出索引越界异常。 请将while条件修改为: 而(日>月[u]&月<月长)
我希望这能奏效

这是因为您的while状况

int monthsLength = months.length()-1;
// So it contains 0-11 index values
//但在你的情况下,它检查12个索引 月[u]。这将抛出索引越界异常。 请将while条件修改为: 而(日>月[u]&月<月长)
我希望这能奏效

也许这不是奎斯顿的答案,但是。我已经看过这个代码示例,并且有一些注释

  • 目前尚不清楚该代码的作用
  • 使用
    date
    时,强烈建议使用特殊类:
    Calendar
    YodaTime
  • 我不知道为什么,但你不必担心闰年的不同日子
  • System.currentTimeMillis()
    ret在当前时间和1970年1月1日UTC午夜之间运行毫秒:因此不清楚为什么在代码中使用
    1970
  • 作为代码示例,请看这一个。也许它能帮你

    public static int getDays(int yearFrom, int yearTo) {
        Calendar calendar = Calendar.getInstance();
        int days = getTotalDays(yearFrom, yearTo, calendar);
    
        for (int year = yearFrom; year < yearTo; year++) {
            calendar.set(Calendar.YEAR, year);
    
            for (int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {
                calendar.set(Calendar.MONTH, month);
                int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    
                if (days <= maxDayOfMonth)
                    break;
    
                days -= maxDayOfMonth;
            }
        }
    
        return days;
    }
    
    private static int getTotalDays(int yearFrom, int yearTo, Calendar calendar) {
        calendar.set(Calendar.DAY_OF_MONTH, 1);
    
        int days = 0;
    
        for (int year = yearFrom; year < yearTo; year++) {
            calendar.set(Calendar.YEAR, year);
            days += calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        }
    
        return days;
    }
    
    public static int getDays(int yearFrom,int yearTo){
    日历=Calendar.getInstance();
    int days=getTotalDays(yearFrom、yearTo、calendar);
    对于(int year=yearFrom;year对于(int month=Calendar.janur;month来说,这可能不是问题的答案,但是。我已经看过这个代码示例,并且有一些注释

  • 目前尚不清楚该代码的作用
  • 使用
    date
    时,强烈建议使用特殊类:
    Calendar
    YodaTime
  • 我不知道为什么,但你不必担心闰年的不同日子
  • System.currentTimeMillis()
    ret在当前时间和1970年1月1日UTC午夜之间运行毫秒:因此不清楚为什么在代码中使用
    1970
  • 作为代码示例,看看这个。它可能会帮助您

    public static int getDays(int yearFrom, int yearTo) {
        Calendar calendar = Calendar.getInstance();
        int days = getTotalDays(yearFrom, yearTo, calendar);
    
        for (int year = yearFrom; year < yearTo; year++) {
            calendar.set(Calendar.YEAR, year);
    
            for (int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {
                calendar.set(Calendar.MONTH, month);
                int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    
                if (days <= maxDayOfMonth)
                    break;
    
                days -= maxDayOfMonth;
            }
        }
    
        return days;
    }
    
    private static int getTotalDays(int yearFrom, int yearTo, Calendar calendar) {
        calendar.set(Calendar.DAY_OF_MONTH, 1);
    
        int days = 0;
    
        for (int year = yearFrom; year < yearTo; year++) {
            calendar.set(Calendar.YEAR, year);
            days += calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        }
    
        return days;
    }
    
    public static int getDays(int yearFrom,int yearTo){
    日历=Calendar.getInstance();
    int days=getTotalDays(yearFrom、yearTo、calendar);
    对于(int year=yearFrom;year对于(int month=Calendar.一月;month哦,成功了!非常感谢。为什么会有不同?我不明白。不客气。我编辑了答案以包括为什么会发生:)哦,成功了!非常感谢。为什么会有不同?我不明白。不客气。我编辑了答案以包括为什么会发生:)