Java jdk6中的Gotchas

Java jdk6中的Gotchas,java,jdk1.6,jdk1.5,Java,Jdk1.6,Jdk1.5,JDK 6中是否存在早期版本中不存在的问题?我感兴趣的是在Timestamp.valueOf()的工作方式中发现一些令人惊讶的变化,比如下面的变化 Timestamp.valueOf(),如果提供的时间戳包含一个日期或一个月,并带有一个数字。例如,2009-9-202009-9-32009-12-4等,在JDK 6中的行为不同-它抛出一个IllegalArgumentException,表示时间戳的格式不正确。而JDK 5(以及更早的版本)在提供正确的值时工作得很好,这些值的前缀是“0” JDK

JDK 6中是否存在早期版本中不存在的问题?我感兴趣的是在Timestamp.valueOf()的工作方式中发现一些令人惊讶的变化,比如下面的变化

Timestamp.valueOf(),如果提供的时间戳包含一个日期或一个月,并带有一个数字。例如,2009-9-202009-9-32009-12-4等,在JDK 6中的行为不同-它抛出一个IllegalArgumentException,表示时间戳的格式不正确。而JDK 5(以及更早的版本)在提供正确的值时工作得很好,这些值的前缀是“0”

JDK 6更严格,因为该方法确实希望它的参数是JDBC时间戳转义格式的字符串。然而,这破坏了用JDK5编写的代码

代码如下:

String s = "2009-9-1 00:00:00";
Timestamp t = Timestamp.valueOf(s);
然而,JDK 6可以将小时、分钟、秒设置为个位数。通过查看JDK 6中Timestamp类的源代码,我发现了问题所在。我发现了一个数组intDate[],它被初始化为{4,2,2},日期中每个项目的长度都会根据这个数组进行检查

为什么时间部分即使有个位数也能正常工作呢?因为根据等效数组intTime[]检查长度的代码在源代码中被注释掉

JDK5中的Timestamp类没有任何这些检查,并且可以很好地处理这些输入

我在官方网站的任何地方都没有发现这样的怪事。虽然我发现另一个人有这个。这个问题很容易解决,我很想找出JDK 6中发生的其他奇怪的变化。

正式

编辑

此外,您还可以查看Sun的bug数据库

这显示Java中bug类型的项目,状态为accepted,关键字为“1.6 1.5”


我检查了其中一些,它看起来像你需要的。

什么让你认为有呢?@Geo,我不同意。我认为一系列真正的改变,改变行为,可以有一个客观的答案。诚然,“专业”的资格是主观的,但我不认为这应该被关闭。诚然,这个问题可以用更好的措辞,但它解决了一个真实的(非主观的)问题,不是吗?被提名重新打开.Vijay,如果你用Timestamp.valueOf发布你的问题,你可能会获得更多的选票重新打开.FWIW,Timestamp.valueOf规范的RFE会更慷慨。行为上的纠正是由于修复了错误“java.sql.Timestamp.valueOf(String)无法抛出IllegalArgumentException”,因此这实际上是JDK5(及更早版本)的一个缺陷。@Oscar:我给出了一个JDK6行为异常的示例。在这里发布问题之前,我已经在官方网站上看到了不兼容列表,尽管我没有发现它有多大用处。另外值得注意的是野马回归挑战(我相信所有提到的问题都是在第一次客户发货之前解决的)@Vijay Dev:我不知道你在发帖之前已经检查过这个列表(你在最初的问题中没有提到),我也不知道你是否已经查看过Sun的bug数据库。这是链接@Oscar:True,我在问题中没有提到这一点。但是bug数据库看起来就像我在寻找的一样。谢谢将对此进行调查。@Oscar:(由@Tom Hawtin在问题的评论中提到)错误数据库中包含有关Timestamp.valueOf()行为的信息。再次感谢!