为什么这个 Calendar 对象的 YEAR 设置为一个奇怪的值?

Why is this Calendar object's YEAR set to a strange value?

我正在编写一个关于日历的应用程序。现在我正在尝试熟悉 Calendar class.

我写了一些代码来获取日期 1st Jan, Integer.MAX_VALUEDAY_OF_WEEK。我以为它会抛出异常或什么的。但它没有!它在星期四输出!这是代码:

Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, Integer.MAX_VALUE);
c.set(Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DATE, 1);
System.out.println (getReadableDayOfWeek(c.get(Calendar.DAY_OF_WEEK)));

注意:方法 getReadableDayOfWeek 就是按照它说的去做。

然后,当我查看文档时,我发现有一个方法叫做getMaximum。所以真的 最大值!所以我添加了一些 println 来查看实际最大值是多少:

System.out.println ("Maximum Year: " + c.getMaximum(Calendar.YEAR));
System.out.println ("Maximum Integer: " + Integer.MAX_VALUE);

输出为:

Maximum Year:    292278994
Maximum Integer: 2147483647

现在我知道最大值远小于 Integer.MAX_VALUE。我想知道我将 YEAR 设置为什么 real 值:

System.out.println ("Actual Year in Calendar object:  " + c.get (Calendar.YEAR));
System.out.println ("Maximum Year:                    " + c.getMaximum(Calendar.YEAR));
System.out.println ("Maximum Integer:                 " + Integer.MAX_VALUE);

我猜它会输出与 c.getMaximum(Calendar.YEAR) 相同的数字,但它没有!

输出:

Actual Year in Calendar object:  190728635
Maximum Year:                    292278994
Maximum Integer:                 2147483647

我超级困惑。为什么会有这样的结果?你能得到292278994之后的星期几吗?

这是 java 中整数溢出的一个例子。溢出不会在 java 中抛出异常。

查看本文:http://javapapers.com/core-java/java-overflow-and-underflow/

因为Integer.MAX_VALUE大于c.getMaximum(Calendar.YEAR)),你会溢出。