JDK 6与早期版本相比是否存在任何需要注意的问题?我想了解一些令人惊讶的变化,例如Timestamp.valueOf()方法的工作方式。
在提供包含单个数字日期或月份的时间戳(例如2009-9-20、2009-9-3、2009-12-4等)时,JDK 6中的Timestamp.valueOf()方法表现不同 - 它会抛出一个IllegalArgumentException异常,表示时间戳格式不正确。而JDK 5(及更早版本)则可以正常工作,只需在这些单个数字前面加上“0”即可。
JDK 6只是更加严格,因为该方法确实希望其参数是符合JDBC时间戳转义格式的字符串。然而,这会破坏使用JDK 5编写的代码。
像下面这样的代码:
String s = "2009-9-1 00:00:00";
Timestamp t = Timestamp.valueOf(s);
然而,JDK 6 对于小时、分钟和秒钟是单个数字的情况没有问题。通过查看JDK 6中Timestamp类的源代码,我找到了问题所在。我发现一个名为intDate[]的数组被初始化为{4,2,2},并且检查日期中每个项目的长度是否与此数组相同。
那么为什么时间部分即使有单个数字也能正常工作呢?因为检查长度的代码在源代码中被注释掉了,这段代码检查长度是否与等效的intTime[]数组相同。
JDK 5中的Timestamp类没有任何这些检查,并且可以很好地处理这样的输入。
我没有在官方网站上找到这样的奇怪之处。虽然我发现另一个人遇到了同样的问题。这个问题很容易修复,我有兴趣找出JDK 6中发生的其他这样奇怪的变化。