这种方法调用应该导致IndexOutOfBoundsException。怎么没有呢?

时间:2015-12-01 23:04:26

标签: java arrays

我写了一个简单的方法,将Date作为参数,然后分别判断它是否在冬天,分别返回true或false。

我通过" date" 2012-13-01作为论点。很明显,数组没有第13个元素,为什么我仍然得到一个返回值(这是假的)?

package calculation;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Calculation {
    public static boolean isWinter(Date date){

        final byte winter[] = {1,1,0,0,0,0,0,0,0,0,0,1};
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        System.out.println();
        return (winter[calendar.get(Calendar.MONTH)] == 0) ? false : true;

    }

    public static void main(String[] args){
        try {
            Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2012-13-01");
            System.out.println(date.toString());
            System.out.println(isWinter(date));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

因为SimpleDateFormat.parse()在13上滚动到下一年的1月。

您可以在自己的输出中看到这一点:

  

Tue Jan 01 00:00:00 CST 2013

稍后创建并查询Calendar一个月时,它会返回0,它位于数组的边界内。

答案 1 :(得分:1)

您正在解析看似无效月份的日期,13,但默认情况下SimpleDateFormat是" lenient",这意味着它会将第13个月解释为次年的第1个月。解析的实际日期是2013年1月1日。

没有IndexOutOfBoundsException,因为1月的月份实际为0CalendarDate s中的月份为0。

答案 2 :(得分:0)

documentation开始,parse 使用日历生成日期。通过查看日历的documentation,我们发现:

  

Calendar有两种解释日历字段的模式,lenient和non-lenient。当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值。

这意味着它接受13作为一个月并简单地换行到1,因此将二月设置为月份,因为宽松是SimpleDateFormat类的默认模式。事实上,从上面的链接文档中,您会发现:

  

默认情况下,解析是宽松的

如果您希望在这种情况下抛出异常,请使用setLenient(false)(请参阅here获取文档)。