JDK 6中需要注意的问题

3

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中发生的其他这样奇怪的变化。

2
你为什么认为有任何的呢? - skaffman
2
@Geo,我不同意。我认为一个严肃的真正改变行为的变化列表可以有客观的答案。不过,“主要”的资格是主观的。 - Yishai
3
我不认为这个问题应该被关闭。诚然,问题的措辞可以更好,但它所涉及的是一个真实(非主观)的问题,不是吗?建议重新开放。 - Brian Agnew
1
Vijay,如果你发布了与Timestamp.valueOf有关的问题,你可能会得到更多的投票以重新开放。 - Yishai
1
值得一提的是,有一个RFE要求Timestamp.valueOf规范更加宽松 http://bugs.sun.com/view_bug.do?bug_id=6763465 。行为上的修正是由于修复了“java.sql.Timestamp.valueOf(String)无法抛出IllegalArgumentException异常”这个错误所导致的 http://bugs.sun.com/view_bug.do?bug_id=5006540 。因此,这实际上是JDK5(以及之前版本)的一个陷阱。 - Tom Hawtin - tackline
显示剩余5条评论
1个回答

7

官方上说,这里是Java 6和5不兼容的地方。

编辑

另外你可以查看Sun的Bug数据库。

这个链接显示了类型为bug、状态为accepted,关键字为"1.6 1.5"的Java项目。

我查看了其中几个,看起来就是你需要的。


@Oscar:我已经给出了一个示例,说明JDK 6的行为并不如预期。在发布问题之前,我已经查看过官方网站上的不兼容列表,但我觉得没有太多用处。 - Vijay Dev
值得一提的是野马回归挑战赛(我相信在首批客户发货之前所有提到的问题都已经解决了)。https://mustang.dev.java.net/regchal/ - Tom Hawtin - tackline
@Vijay Dev:我不知道你在发布问题之前是否已经检查了列表(你在原始问题中没有提到)。我也不知道你是否已经查看了Sun的错误数据库。这是链接http://bit.ly/3ZohZ5。 - OscarRyz
@Oscar:确实,我在问题中没有提到那个。但是这个缺陷数据库看起来就像我所需要的。谢谢!我会研究一下的。 - Vijay Dev
@Oscar:http://bugs.sun.com/view_bug.do?bug_id=6763465(由@Tom Hawtin在评论中提到)在错误数据库中包含了有关Timestamp.valueOf()行为的信息。再次感谢! - Vijay Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接